【问题标题】:C struct memory allocation on visual studioVisual Studio上的C结构内存分配
【发布时间】: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 它普遍可用
  • 您遇到了什么错误?编辑您的问题并将其复制并粘贴到那里。

标签: c memory struct


【解决方案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 指向的。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
相关资源
最近更新 更多