我是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 管理的缓冲区,并且不执行系统调用。所以这就是为什么你的程序没有立即崩溃的原因。
对于较大的缓冲区,通常它们直接分配给请求给操作系统的页面,因此当它们被释放时,内存被释放到操作系统,指针不再指向任何内存。