gpt4 book ai didi

c - 动态分配——内存管理

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:30 25 4
gpt4 key购买 nike

我知道malloc()是over allowing,free()不会释放整个内存。我测试了一个检查所有这些的代码:

extern char _end;
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{

char * res;
int tas,rupt,esp;
printf("\n Before any memory reservation\n --------------------------\n");
tas=sbrk(0);
printf("End position of the pile : %p\n",tas);
rupt=&_end;
printf("Breaking point : %p\n",rupt);
esp=tas-rupt;
printf("Space between the end of the heap and breaking point : %d bytes \n",esp);
printf("Pages allocated for malloc %f\n",(tas-rupt-esp)/4096.0);
printf("whether %d bytes\n",tas-rupt-esp);



int nbEntier = 0, i = 0;
int* tabEntier ; // This pointer is used as a table after the call of malloc

// Asked the number of integers to the user
printf("How integer do you want to store? ");
scanf("%d", &nbEntier);

if (nbEntier > 0)
{
tabEntier = malloc(nbEntier * sizeof(int));
if (tabEntier== 0)
{
exit(0); //
}

//We ask the integer
for (i = 0 ; i < nbEntier ; i++)
{
printf("Integer n° %d ? ", i + 1);
scanf("%d", &tabEntier[i]);
}

// We display the integer one to one
printf("\n\nYour integers are :\n");
for (i = 0 ; i < nbEntier ; i++)
{
printf("%d \n", tabEntier[i]);
}
tas=sbrk(0);
printf("End position of the pile : %p\n",tas);
rupt=&_end;
printf("Breaking point : %p\n",rupt);
printf("Space between the end of the heap and breaking point : %d bytes \n",tas-rupt);
printf("Pages allocated for malloc %f\n",(tas-rupt-esp)/4096.0);
printf("whether %d bytes\n",tas-rupt-esp);

free(tabEntier);


printf("\nDisplay after free ():\n");


printf("\n\nYour integers are :\n");
for (i = 0 ; i < nbEntier ; i++)
{
printf("%d \n", tabEntier[i]);
}



}

return 0;
}

我的结果:

Before any memory reservation--------------------------End position of the pile : 0x9886000Breaking point : 0x8049c2cSpace between the end of the heap and breaking point : 25412564 bytes Pages allocated for malloc 0.000000 whether 0 bytesHow integer do you want to store? 3Integer n° 1 ? 45Integer n° 2 ? 85Integer n° 3 ? 78Your integers are :45 85 78 End position of the pile : 0x98a7000Breaking point : 0x8049c2cSpace between the end of the heap and breaking point : 25547732 bytes Pages allocated for malloc 33.000000whether 135168 bytesDisplay after free ():Your integers are :0 85 78

我不明白!它一直分配 33 页,即使我问一个整数,也为什么在 free () 之后它释放整个第一个而不是其余的..

最佳答案

计算机通过忘记存储在存储单元中的内容来释放内存。当您键入 free() 时,您只是简单地告诉堆管理该地址没有存储任何感兴趣的内容,并且不再保留内存单元。因此,不存在“删除”存储单元这样的事情,不会执行主动向其写入零的代码。

在您的特定情况下,您调用 free() 并告诉它 3xsizeof(int) 字节可供程序的其余部分免费使用。该程序的某些其他部分需要将值 0 存储在某处,而它恰好位于您之前保留的单元格中。

通常,打印已传递给 free() 的指针的内容是未定义的行为。任何事情都可能发生。详述为什么未定义的行为在特定编译器的特定程序中以特定方式起作用是毫无意义的知识。在 free() 调用之后,简单地接受内存单元不可信任,这就足够了。

关于c - 动态分配——内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com