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; 不复制字符串。 cpysourcesource 都是指针,因此这会尝试复制指针(通过赋值)。但是,source 指向 const charcpysource 指向 char,因此编译器会警告您删除限定符。要复制字符串,请使用:

strcpy(cpysource, source);

【讨论】:

FWIW 可能还值得一提的是,如果他们要自定义 String,他们可能还应该存储长度。 这一行仍然有问题 newString->str = cpysource;仍然有内存违规 同样的问题。你需要strcpycpysource,而不是分配它。 @dentetorto 你在检查malloc 的结果吗?提醒当malloc 失败时它返回NULL @xuman: Re“你需要对cpysource进行strcpy,而不是分配它”:不,cpysourcenewString->str都是指针,newString->str应该设置为指向分配的内存,这是cpysource 指向的。

以上是关于Visual Studio上的C结构内存分配的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio2008 C++结构体成员需要内存对齐吗?

Visual Studio 2010 占用内存问题

Visual Studio Express 中 C++ 中的内存分配问题

在 Visual Studio C++ 中,内存分配表示形式是啥?

Visual Studio 上的 IPC

Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面