我有一个包含 char* 的数组 user_input。现在,该数组的大小将在运行时由以下代码确定。
char** user_input;
user_input = (char**)malloc(get_size());
现在,user_input 中的每个索引都将包含一个指向从函数 parse_index(int) 接收的动态分配的字符数组的指针。
for(int i=0;i<SIZE;i++){
user_input[i]=parse_index[i]; //parse_index makes a call to malloc
}
现在,当我完成后,我通过以下代码释放堆上的所有内存。
//to deallocate the character arrays
for(int i=0;i<SIZE;i++){
free(user_input[i])
}
//to deallocate the char*
free(user_input)
但是第二次调用导致程序崩溃..有人可以解释我做错了什么吗?
最佳答案
这看起来不错,只要 get_size()
返回一个合理的值,循环上升到 SIZE
上升到用户的大小(或更小)输入(并且两者去相同!),并且 parse_index[i]
包含足够的 malloc(3)
ed 内存,不是 free(3)
在别处编辑。
我们需要很多程序来诊断问题。它甚至可能是一些完全不相关的涂鸦你的数据结构...简化程序以在此处显示它很好,只要简化版本以相同的方式崩溃。
使用最多的警告进行编译,找出每一个并修复它(了解编译器认为错误的地方,不要只是关闭它)或确保编译器混淆或处理不完整的数据。在调试器下运行你的程序,让它崩溃。找出地点/原因/方式。在 valgrind 下运行程序或类似的诊断可能的内存处理不一致。
顺便说一句,强制转换 malloc(3)
是个坏主意,它不是必需的,并且可能会掩盖错误。
关于c - 释放指向指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15181793/