与c中的calloc和自由函数有关的问题

问题描述 投票:1回答:1

我是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()函数。为什么数组的所有元素都不为零?

c malloc dynamic-memory-allocation free calloc
1个回答
0
投票

[内存中的数据可能不会消失,它们可以在free之后存储在内存中。但是尝试从释放的内存中读取是未定义的行为。当然,可以在将NULL设置为free之后将指针分配给Setting variable to NULL after free


0
投票

将内存设置为0会产生一些费用。

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

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

对于较大的缓冲区,通常将它们直接分配给请求给OS的页面,因此释放它们时,内存将释放给OS,并且指针不再指向任何内存。

© www.soinside.com 2019 - 2024. All rights reserved.