c - calloc 实际分配了多少内存?

标签 c calloc

下面的代码在测试时,输出为

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。

当您向 malloccalloc 请求 5 个字节时,它不会转身向内核请求 5 个字节。那将花费永远。相反,libc 堆系统从内核中获取更大的内存块,并将其 segmentation 。

因此,当您请求少量内存时,通常紧随其后的是大量未被 libc 分配的可访问内存,您可以访问它。当然,访问它是错误的即时秘诀。

只有当您恰好位于从内核获取的区域的末尾时,引用结束才会收到 SIGnal。

我建议您尝试在 valgrind 下运行您的测试用例以获得更多见解。

关于c - calloc 实际分配了多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25712609/

相关文章:

python - 使用 PyCuda 的遗传细胞自动机,如何有效地将每个细胞的大量数据传递给 CUDA 内核?

c - 如何正确等待 execve 完成?

C 默认参数

macos - calloc 或 malloc 可以用于在 OSX 中仅分配物理内存吗?

c - 如何获取小数点后的数字

objective-c - 为地理坐标类实现 -hash 和 -isEqual

Calloc 内部函数

C 帮助解释 calloc segfault

c - 是否可以释放使用 calloc 分配的 char *"

c++ - 为什么在释放由 apriltags image_u8_create() 分配并存储在 C++ 指针的 2D vector 中的内存时出现错误?