一个关于 Cc 中的 calloc 和自由函数的问题



我是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 %dn", i[0], i[1], i[2], i[3]);
printf("before: %d %dn", i, (i + 3));
free(i);
printf("after: %d %d %d %dn", i[0], i[1], i[2], i[3]);
printf("after: %d %dn", i, (i + 3));

和输出:

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

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

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

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

calloc在调用内存时已将内存设置为 0。释放后,您说您不打算再使用该内存区域,因此从中读取是一个错误,如果页面未映射,甚至会使程序崩溃。

通常,对于小缓冲区(例如在您的情况下(,malloc/calloc 指向由 libc 管理的缓冲区,并且不执行系统调用。所以这就是为什么你的程序没有立即崩溃的原因。

对于较大的缓冲区,通常它们直接分配给请求给操作系统的页面,因此当它们被释放时,内存被释放到操作系统,指针不再指向任何内存。

相关内容

  • 没有找到相关文章

最新更新