【问题标题】:Problems with 'Heap Buffer' Error in CC 中“堆缓冲区”错误的问题
【发布时间】:2009-10-09 13:24:15
【问题描述】:

我在C 程序中收到以下错误:

帮助缓冲区结束后写入堆

你能告诉我我错过了什么吗?

char * path_delimiter(char * path)
{
    int i = 0, index = 0, size = 0, length = (int)strlen(path);
    char *tmp, *ans;

    for(; i < length; i++) {
        if(path[i] == PATH_DELIM[0]) {
          break;
        }
    }
    i++;
    size = (int)strlen(path) - i;
    ans = (char*)malloc(sizeof(path));
    tmp = (char*)malloc(size);
    strcpy(ans,path);
    ans[i-1] = END_ARRAY;

    if(size > 0)
    {
        strcpy(tmp,&path[i]);
        realloc(path,size);
        strcpy(path,tmp);
    }
    else 
    {
        strcpy(path,ans);
    }
free(tmp);

return ans;
}

【问题讨论】:

  • 请编辑以格式化您的代码:单击 1010 链接并将每个代码行缩进 4 个空格 - 更多以显示代码内的缩进。
  • 了解您要做什么会有所帮助。例如,你认为malloc(sizeof(path)) 做了什么?

标签: c malloc


【解决方案1】:

这...

sizeof(path)

...与...相同

sizeof(char *)

...这是指针的大小(不是它指向的缓冲区的大小),所以它可能大约是 4。

所以这个...

ans= (char*)malloc(sizeof(path));

... 是一个 4 字节的缓冲区,所以这个 ...

strcpy(ans,path);

... 正在覆盖(写入到末尾)该缓冲区。

而不是...

malloc(sizeof(path));

...我想你想要...

malloc(strlen(path)+1);

【讨论】:

  • 致 OP:请暂时使用 strncpy。它将为您省去很多麻烦。
  • 不应该是:malloc(sizeof(char)*(strlen(path)+1));您假设 char 为 1 个字节。
  • 安德鲁,我认为sizeof(char) 总是等于 1,根据定义。
  • @Calyth - strncpy() 不是灵丹妙药;它并不总是 null 终止它复制的字符串,它总是写入你告诉它有空间的字符(这不是矛盾的陈述,尽管看起来像那样)。
【解决方案2】:

您没有检查malloc 和realloc 是否成功。更重要的是,realloc 可能会返回您要丢弃的不同句柄。

此外,您还有:

ans = malloc(sizeof(path));
...
strcpy(ans, path);

在当今最常见的平台上,sizeof(path) 很可能是 4 或 8,而不管 path 指向的字符数组的长度如何。

【讨论】:

    【解决方案3】:

    您通常需要size = strlen(xxx) + 1; 以允许在字符串上使用空终止符。

    在这种情况下,我认为你需要:

    size = strlen(path) - i + 1;
    

    【讨论】:

    • 感谢您解决了我的问题...但是要确定当我使用 strlen 方法时,如果没有,我需要为 '\0' 添加 1,那么我为什么需要 +1再次感谢
    • strlen() 函数计算字符串中不包括终止空值的字符数。分配内存时,必须为字符串分配足够的内存,包括终止的 null,因此是 'strlen(whatever)+1' 字节。
    猜你喜欢
    • 2021-09-20
    • 2020-07-25
    • 2012-09-12
    • 1970-01-01
    • 2023-01-25
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多