C中"堆缓冲区"错误的问题

1 c malloc

我的C程序中出现以下错误:

Writing to heap after end of help buffer

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

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;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*isW 8

这个 ...

sizeof(path)
Run Code Online (Sandbox Code Playgroud)

... 是相同的 ...

sizeof(char *)
Run Code Online (Sandbox Code Playgroud)

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

所以这 ...

ans= (char*)malloc(sizeof(path));
Run Code Online (Sandbox Code Playgroud)

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

strcpy(ans,path);
Run Code Online (Sandbox Code Playgroud)

...正在覆盖(写完那个缓冲区).

代替 ...

malloc(sizeof(path));
Run Code Online (Sandbox Code Playgroud)

......我想你想......

malloc(strlen(path)+1);
Run Code Online (Sandbox Code Playgroud)

  • 安德鲁,我认为`sizeof(char)`总是等于1,顾名思义. (2认同)

Sin*_*nür 5

你是不是检查,如果mallocrealloc成功.更重要的是,realloc可能会返回您要丢弃的不同句柄.

此外,你有:

ans = malloc(sizeof(path));
...
strcpy(ans, path);
Run Code Online (Sandbox Code Playgroud)

在今天最常见的平台上,sizeof(path)无论字符数组的长度如何,最有可能是4或8 path.