本帖最后由 jhanker 于 2024-7-14 08:58 编辑
1.请调试下列代码,简要说说你对堆空间分配的理解。
2.截取调试的图片上传到学习群!#include<stdio.h>
#include <stdlib.h>
int main()
{
int *p[6];
int i=0,j=0;
for (i=0;i<6;i++)
{
p[i]=(int *)malloc(3*sizeof(int));
for (j=0;j<3;j++)
{
p[i][j]=0xdddddddd;
}
}
free(p[1]);
free(p[3]);
free(p[4]);
return 0;
}
本帖最后由 cnkizy 于 2022-9-14 17:08 编辑
首先我是小菜鸟哈,我的回答可能会让你失望。
我弄了很久没发现有啥问题呢,你发的贴子那个博主说的问题,很明显的问题,hello world! 的长度是12,但字符串后面还有一个\0结尾,strlen的结果是12,但strcpy会把\0也复制过去,带上这玩意,它长度就是13了,然后写到后面的下溢标志里,就有错了。
1.两图中未说明的数据表示什么?
未说明的数据 是指?
2.回收空间的数据块大小好像块中没有指示?(free后,由于p[3],p[4]指向的空间是连续的。所以会直接合并,在堆内存中可以看到)
在我本地vs2022里,没发现有合并的情况,free的大小你也说了,在malloc时不仅仅只分配了空间,还有一个结构上面有类型和大小,数据块大小是0c
分配之前堆内存:
释放内存之后:
中午在看到你这个问题的时候,我想起了最近在看的书,相当不错。
《程序员的自我修养—链接、装载与库》
你看首页
是不是吊足了你的胃口。
可惜的是,书上关于malloc这一块,也就是312页,10.3.4这一节,并未给出明确答案,只是告诉读者,malloc有自己的算法,申请的空间不仅仅是程序员给出的这一点东西。
它提出的是一个很简单的模型
继续探讨下呢
|