一个关于 C 中的 calloc 和 free 函数的问题

A problem that is about calloc and free functions in C

我是 C 的新手

这是我的代码:

int *i = (int *)calloc(10, sizeof(int));
i[0] = 3;
i[1] = 1;
i[2] = 2;
i[3] = 5;
printf("before: %d %d %d %d\n", i[0], i[1], i[2], i[3]);
printf("before: %d %d\n", i, (i + 3));

free(i);

printf("after: %d %d %d %d\n", i[0], i[1], i[2], i[3]);
printf("after: %d %d\n", i, (i + 3));

并输出:

before: 3 1 2 5
before: 3 5
after: 0 0 2 5
after: 0 5

我使用了 free() 函数。为什么不是数组的所有元素都为零?

内存中的数据可能不会消失,在freeing之后它们可以存在于内存中。但是尝试从释放的内存中读取是未定义的行为。可以肯定的是,您可以在 freeing (Setting variable to NULL after free) 之后将指针分配给 NULL

将内存设置为 0 会产生一些成本。

calloc 在调用时已经将内存设置为 0。 free 后你是说你不打算再使用那个内存区域,所以从它读取是一个错误,如果页面未映射,甚至可能使你的程序崩溃。

通常,对于像您这样的小缓冲区,malloc/calloc 指向由您的 libc 管理的缓冲区,并且不执行系统调用。这就是为什么您的程序没有立即崩溃的原因。

对于较大的缓冲区,通常它们直接分配给 OS 请求的页面,因此当它们被释放时,内存被释放到 OS 并且指针不再指向任何内存完全没有。