下面的代码在测试时,输出为
1
0
0
2
0
这很神奇,因为 ptr[3]、ptr[4] 没有任何内存分配。尽管他们在其中存储了值(value)并将其打印出来。我在 ptr[i] 中对几个较大的 i 尝试了相同的代码,它再次成功编译并给出了结果,但是对于非常大的 i 值,大约 100000,程序崩溃了。如果 calloc() 在单个调用中分配如此大的内存,那么它不值得有效。那么 calloc() 是如何工作的呢?这种差异在哪里?
#include <stdio.h>
void main() {
int * ptr = (int *)calloc(3,sizeof(int));//allocates memory to 3 integer
int i = 0;
*ptr = 1;
*(ptr+3) = 2;//although memory is not allocated but get initialized
for( i =0 ; i<5 ; ++i){
printf("%d\n",*ptr++);
}
}
之后我尝试了这段代码,它连续运行没有任何输出
#include <stdio.h>
void main() {
int * ptr = (int *)calloc(3,sizeof(int));
int i = 0;
*ptr = 1;
*(ptr+3) = 2;
//free(ptr+2);
for( ; ptr!=NULL ;)
{
//printf("%d\n",*ptr++);
i++;
}
printf("%d",i);
}
最佳答案
您混淆了两种内存分配:内核和 libc。
当您向 malloc
或 calloc
请求 5 个字节时,它不会转身向内核请求 5 个字节。那将花费永远。相反,libc 堆系统从内核中获取更大的内存块,并将其 segmentation 。
因此,当您请求少量内存时,通常紧随其后的是大量未被 libc 分配的可访问内存,您可以访问它。当然,访问它是错误的即时秘诀。
只有当您恰好位于从内核获取的区域的末尾时,引用结束才会收到 SIGnal。
我建议您尝试在 valgrind
下运行您的测试用例以获得更多见解。
关于c - calloc 实际分配了多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25712609/