当我尝试释放我的阵列时,它会给我一个"检测到堆损坏"错误。我的程序有点复杂,所以我把它简化为以下内容:
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行代码。答案 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释放空间,则 行为未定义。