求救,调试下述代码,粗略理解堆内存的管理!
本帖最后由 jhanker 于 2024-7-14 08:58 编辑1.请调试下列代码,简要说说你对堆空间分配的理解。
2.截取调试的图片上传到学习群!
#include<stdio.h>
#include <stdlib.h>
int main()
{
int *p;
int i=0,j=0;
for (i=0;i<6;i++)
{
p=(int *)malloc(3*sizeof(int));
for (j=0;j<3;j++)
{
p=0xdddddddd;
}
}
free(p);
free(p);
free(p);
return 0;
}
本帖最后由 cnkizy 于 2022-9-14 17:08 编辑
首先我是小菜鸟哈,我的回答可能会让你失望。
{:10_266:}
我弄了很久没发现有啥问题呢,你发的贴子那个博主说的问题,很明显的问题,hello world! 的长度是12,但字符串后面还有一个\0结尾,strlen的结果是12,但strcpy会把\0也复制过去,带上这玩意,它长度就是13了,然后写到后面的下溢标志里,就有错了。
1.两图中未说明的数据表示什么?
未说明的数据 是指?
2.回收空间的数据块大小好像块中没有指示?(free后,由于p,p指向的空间是连续的。所以会直接合并,在堆内存中可以看到)
在我本地vs2022里,没发现有合并的情况,free的大小你也说了,在malloc时不仅仅只分配了空间,还有一个结构上面有类型和大小,数据块大小是0c
分配之前堆内存:
释放内存之后:
中午在看到你这个问题的时候,我想起了最近在看的书,相当不错。
《程序员的自我修养—链接、装载与库》
你看首页
是不是吊足了你的胃口。
可惜的是,书上关于malloc这一块,也就是312页,10.3.4这一节,并未给出明确答案,只是告诉读者,malloc有自己的算法,申请的空间不仅仅是程序员给出的这一点东西。
它提出的是一个很简单的模型
继续探讨下呢
已分配堆空间结构图:
回收堆空间结构图:
本帖最后由 jhanker 于 2022-4-29 00:07 编辑
但现在有几个问题:
1.两图中未说明的数据表示什么?
2.回收空间的数据块大小好像块中没有指示?(free后,由于p,p指向的空间是连续的。所以会直接合并,在堆内存中可以看到) 进一步探索:
网上对堆结构的分析:
堆的理解 好东西没人看 什么时候才能确认最佳答案 【已收藏】 有没有人回复一下,我可以把鱼币给他{:5_109:} mark,等我下午来做{:10_256:} cnkizy 发表于 2022-9-14 11:39
mark,等我下午来做
好,多写几个字,就把鱼币给你了! cnkizy 发表于 2022-9-14 17:05
首先我是小菜鸟哈,我的回答可能会让你失望。
我弄了很久没发现有啥问题呢,你发的贴子那个博 ...
这本书我有,谢谢推荐。不错! cnkizy 发表于 2022-4-28 19:47
首先我是小菜鸟哈,我的回答可能会让你失望。
我弄了很久没发现有啥问题呢,你发的贴子那个博 ...
其实发该贴知识想把C语言中处理堆空间的方法给鱼油们普及一下而已 我来说说我的理解:
整型的 1个指针数组 中 有6个指针;
按矩阵排列如下:
0元素指分配内存: 3个int非连续长度的空间
0元素空间中 的 首地址 实际存为 0xdddddddd
0元素空间中 的 1地址实际存为 0xdddddddd
0元素空间中 的 3地址实际存为 0xdddddddd
1元素空间中 的 首地址 实际存为 0xdddddddd
1元素空间中 的 1地址实际存为 0xdddddddd
1元素空间中 的 3地址实际存为 0xdddddddd
2元素空间中 的 首地址 实际存为 0xdddddddd
2元素空间中 的 1地址实际存为 0xdddddddd
2元素空间中 的 3地址实际存为 0xdddddddd
... 以此类推 ...
实际6个指针中,分成了3段地址,共18个地址
最后
以3个为一组,分别删除对 1 3 4元素的引用,共9
个地址无法访问了. 上图3地址,打字手误,3实际上是2 对了没有,有没有鱼币可接收,谢谢 howzyao 发表于 2022-9-17 08:26
对了没有,有没有鱼币可接收,谢谢
鱼币已经给人了!你到我其他的贴子里可以得到鱼币
做了一遍debug,得到的收获是:
1,声明指针数组的时候,并没有得到指向的内存空间.
2,当使用malloc时,返回的地址,才被赋值,而且malloc好像有"记忆"功能,能在下次使用时,接着上次的地址划分.
3,指针数组中的每个元素,都得到了3个int长度的空间.
水平不限,暂时还未发现其它悬念,但看指定下标,析构指针的用意,应当还有下文.
感谢楼主的悉心教学.
页:
[1]
2