当我尝试释放数组时,会出现"检测到堆损坏"错误。我的程序有点复杂,所以我将其简化为以下内容:
char ***courses = (char ***)malloc(1, sizeof(char**));
courses[0] = (char**)malloc(2, sizeof(char*));
courses[0][1] = (char*)calloc(5, sizeof(char));
courses[0][0] = "aaaa";
courses[0][1] = "aaaa";
free(courses[0][1]);
当我运行简化表单时,它不会给我"检测到堆损坏"的错误,但它会说"程序触发了断点"。我做错了什么?所有这些错误都是由"自由"函数引起的。
编辑:我忘了在分配课程[0][1]内存的地方添加行。添加了第3行代码。
courses[0][1] = "aaaa";
courses[0][1]
指向字符串文字,这不是您分配的内容。因此,未定义的行为结果。
使用free()
的规则非常简单:只free()
是malloc()
/calloc()
/realloc()
函数返回的指针或NULL
指针。传递任何其他内容都是无效的。
C11,7.22.3.3,自由功能状态
free函数导致ptr指向的空间为解除分配,也就是说,可用于进一步分配。如果ptr是空指针,则不会发生任何操作。否则,如果参数没有匹配内存管理函数先前返回的指针,或者如果通过调用free或realloc释放了空间,则行为未定义。