自由函数触发断点c

时间:2015-12-22 18:35:12

标签: c pointers malloc free

当我尝试释放我的阵列时,它会给我一个"检测到堆损坏"错误。我的程序有点复杂,所以我把它简化为以下内容:

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]);

当我运行简化表单时,它并没有给我检测到"堆损坏"错误,但它说"程序触发了一个断点"。我究竟做错了什么?所有这些错误都是由" free"功能

编辑:我忘记添加为课程[0] [1]分配内存的行。添加了第3行代码。

1 个答案:

答案 0 :(得分:1)

courses[0][1] = "aaaa";

courses[0][1]指向字符串文字,这不是您分配的内容。所以undefined behaviour会产生结果。

使用free()的规则非常简单:只有free() malloc() / calloc() / realloc()函数返回的指针或{ {1}}指针。 传递任何其他内容无效。

C11,7.22.3.3,自由功能状态

  

free函数导致ptr指向的空间   取消分配,即可用于进一步分配。如果是ptr   空指针,不会发生任何操作。否则,如果参数没有   匹配之前由内存管理函数返回的指针,或   如果通过调用free或realloc释放空间,则   行为未定义。