Visual Studio上的C结构内存分配
Posted
技术标签:
【中文标题】Visual Studio上的C结构内存分配【英文标题】:C struct memory allocation on visual studio 【发布时间】:2021-10-31 02:05:47 【问题描述】:我在函数的第 5 行遇到访问冲突错误:
newString->str = cpysource;
我正在尝试将 char * 复制到字符串的值。
typedef struct
char* str;
String;
这是我的struct
。
String* CreateString(const char* source)
int len1 = strlen(source);
char* cpysource = (char*)malloc(len1 * sizeof(char));
cpysource = source;
String* newString = malloc(sizeof(String));
newString->str = cpysource;
return newString;
【问题讨论】:
您正在分配cpysource
,然后通过在其顶部分配source
而不是执行strcpy
来立即泄漏它。此外,您不需要在 C 中的 malloc
之后进行转换
cpysource = source;
除了指针之外不复制任何内容。 cpysource
现在指向与 source
相同的内存位置。您可以只使用cpysource = strdup(source);
(并跳过手动分配空间)
还有malloc(len1 * sizeof(char))
--> malloc(len1 * sizeof(char) + 1)
为NUL
终结者留出空间。
@StefanRiedel 注意:strdup
isn't officially part of C until C23 但它是 POSIX。那就是说 AFAIK 它普遍可用
您遇到了什么错误?编辑您的问题并将其复制并粘贴到那里。
【参考方案1】:
malloc(len1 * sizeof(char))
没有为字符串分配足够的空间。您需要为终止字符串的空字符留出空间。使用:
char *cpysource = malloc((len+1) * sizeof *cpysource);
(sizeof *cpysource
是 1,所以这也可能是 char *cpysource = malloc(len+1);
。但是,保持上面的状态会自动适应,以防 cpysource
稍后更改为不同的类型,例如宽字符类型。)
cpysource = source;
不复制字符串。 cpysource
和 source
都是指针,因此这会尝试复制指针(通过赋值)。但是,source
指向 const char
,cpysource
指向 char
,因此编译器会警告您删除限定符。要复制字符串,请使用:
strcpy(cpysource, source);
【讨论】:
FWIW 可能还值得一提的是,如果他们要自定义String
,他们可能还应该存储长度。
这一行仍然有问题 newString->str = cpysource;仍然有内存违规
同样的问题。你需要strcpy
cpysource
,而不是分配它。
@dentetorto 你在检查malloc
的结果吗?提醒当malloc
失败时它返回NULL
@xuman: Re“你需要对cpysource进行strcpy,而不是分配它”:不,cpysource
和newString->str
都是指针,newString->str
应该设置为指向分配的内存,这是cpysource
指向的。以上是关于Visual Studio上的C结构内存分配的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio2008 C++结构体成员需要内存对齐吗?
Visual Studio Express 中 C++ 中的内存分配问题