字符串的动态数组,但我检测到堆损坏

Posted

技术标签:

【中文标题】字符串的动态数组,但我检测到堆损坏【英文标题】:dynamic array of strings, but i get heap corruption detected 【发布时间】:2020-05-19 12:39:29 【问题描述】:

我尝试创建一个 char 指针的动态数组,指针也可以是动态内存是什么意思,所以在上面的代码中,我尝试为数组分配一个大小,在他中,为第一个对象分配一个字符串.但我在数组指针上收到错误“检测到堆损坏”。

int main(void)


    char** pArr = 0;
    char string[] = "hello";

    pArr = (char**)malloc(sizeof(char) * 1); //make it an array with one element
    *pArr = (char*)malloc(sizeof(char) * (strlen(string) + 1)); //make it an array with the size of string
    strcpy(*pArr, string); //copy string to the first element of the array

    printf("%p", pArr); //the pointer where the heap corruption is detected

    free(pArr);

    getchar();
    return 0;

我复制了整个主目录,所以你知道我没有预料到这一点。

【问题讨论】:

使用 pArr = (char**)malloc(sizeof(char *)); * 1 毫无意义,只会使代码混乱。 【参考方案1】:

你没有在这里分配足够的空间:

pArr = (char**)malloc(sizeof(char) * 1); 

您只为 1 个char 而不是 1 个char * 分配空间。所以你最终会写到调用undefined behavior的分配内存的末尾。

分配正确的空间量:

pArr = malloc(sizeof(char *) * 1); 

或者更好:

pArr = malloc(sizeof(*ptr) * 1); 

【讨论】:

是的,你是对的,所以指针有自己的大小感谢课程! @ArturKarabekov 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer。

以上是关于字符串的动态数组,但我检测到堆损坏的主要内容,如果未能解决你的问题,请参考以下文章

释放 2D 数组 - 检测到堆损坏

在 dll 导出期间块之前检测到堆损坏

在 C++ 中检测到堆损坏错误

检测到堆损坏 - 仅限 iPhone 5S

在 vs2008 中升级后检测到堆损坏

将项目从 vc6 升级到 vc9 后检测到堆损坏