一个关于 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()
函数。为什么不是数组的所有元素都为零?
内存中的数据可能不会消失,在free
ing之后它们可以存在于内存中。但是尝试从释放的内存中读取是未定义的行为。可以肯定的是,您可以在 free
ing (Setting variable to NULL after free) 之后将指针分配给 NULL
。
将内存设置为 0 会产生一些成本。
calloc
在调用时已经将内存设置为 0。 free 后你是说你不打算再使用那个内存区域,所以从它读取是一个错误,如果页面未映射,甚至可能使你的程序崩溃。
通常,对于像您这样的小缓冲区,malloc/calloc 指向由您的 libc 管理的缓冲区,并且不执行系统调用。这就是为什么您的程序没有立即崩溃的原因。
对于较大的缓冲区,通常它们直接分配给 OS 请求的页面,因此当它们被释放时,内存被释放到 OS 并且指针不再指向任何内存完全没有。
我是 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()
函数。为什么不是数组的所有元素都为零?
内存中的数据可能不会消失,在free
ing之后它们可以存在于内存中。但是尝试从释放的内存中读取是未定义的行为。可以肯定的是,您可以在 free
ing (Setting variable to NULL after free) 之后将指针分配给 NULL
。
将内存设置为 0 会产生一些成本。
calloc
在调用时已经将内存设置为 0。 free 后你是说你不打算再使用那个内存区域,所以从它读取是一个错误,如果页面未映射,甚至可能使你的程序崩溃。
通常,对于像您这样的小缓冲区,malloc/calloc 指向由您的 libc 管理的缓冲区,并且不执行系统调用。这就是为什么您的程序没有立即崩溃的原因。
对于较大的缓冲区,通常它们直接分配给 OS 请求的页面,因此当它们被释放时,内存被释放到 OS 并且指针不再指向任何内存完全没有。