【发布时间】:2021-02-11 01:53:07
【问题描述】:
我是一名学习 C 的学生,我正在使用字符串数组和 malloc()。
我有以下代码,它应该使用动态创建的字符串加载字符串数组(静态创建)(如果我的术语与我拥有的代码不一致,请原谅/纠正我)。
问题是,一旦我去释放该内存,我会收到以下错误:free(): invalid pointer
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define RAM_SIZE 5
char* ram [RAM_SIZE];
int next_free_cell = 0;
void freeAndNullRam(){
for (int i = 0 ; i < RAM_SIZE ; i++){
printf("%d\n", i);
free(ram[i]);
ram[i] = NULL;
}
}
int main(int argc, const char *argv[])
{
for (int i= 0; i < RAM_SIZE; i++){
ram[i] = (char*)malloc(sizeof(char*)*5);
ram[i] = "aaaa";
}
for (int i= 0; i < RAM_SIZE; i++){
int empty = (ram[i] ==NULL);
if(!empty){
printf("%s\n", ram[i]);
}
}
freeAndNullRam();
for (int i= 0; i < RAM_SIZE; i++){
int empty = (ram[i] ==NULL);
printf("%d\n", empty);
}
return 0;
}
我知道问题肯定出在freeAndNullRam() 函数中(显然),但我不明白为什么。我的理解是,在编译时,会创建一个包含 5 个指向 char 数组的指针的数组,但要真正填充数组的单元格,我需要 malloc 他们一些内存。为什么当我释放数组中的指针时程序会报错,而当我给它们内存时却没有?
谢谢!
【问题讨论】:
-
你不需要
NULL。只需free()。一旦你free()某物它已经死了,就像一个幽灵,你永远不应该碰它。释放后使用的错误很严重。 -
提示:如果有,请使用
strdup()。 -
@tadman 我知道我不需要
NULL,严格来说,但这是我正在处理的一个更大项目的一个组件,数组中的空条目用于某些事情. -
提示:用有意义的名称命名变量,而不是像
ram这样的随机垃圾,它是如此模糊以至于毫无意义。更好的选择是names或entries。 -
@tadman 再次感谢您的帮助,我想我应该删除用于其他用途的代码部分。这是一个类,我们应该在其中模拟一个需要“ram”数据结构的操作系统。因此得名。