jhanker 发表于 2022-4-28 19:47:09

求救,调试下述代码,粗略理解堆内存的管理!

本帖最后由 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-4-28 19:47:10

本帖最后由 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-28 22:06:02

已分配堆空间结构图:

jhanker 发表于 2022-4-28 22:07:11

回收堆空间结构图:

jhanker 发表于 2022-4-28 22:09:32

本帖最后由 jhanker 于 2022-4-29 00:07 编辑

但现在有几个问题:
1.两图中未说明的数据表示什么?
2.回收空间的数据块大小好像块中没有指示?(free后,由于p,p指向的空间是连续的。所以会直接合并,在堆内存中可以看到)

jhanker 发表于 2022-4-29 00:36:19

进一步探索:

jhanker 发表于 2022-4-29 00:40:35

网上对堆结构的分析:
堆的理解

jhanker 发表于 2022-8-25 16:39:40

好东西没人看

jhanker 发表于 2022-8-31 14:44:28

什么时候才能确认最佳答案

gandixiwang 发表于 2022-9-3 09:36:51

【已收藏】

jhanker 发表于 2022-9-14 10:28:00

有没有人回复一下,我可以把鱼币给他{:5_109:}

cnkizy 发表于 2022-9-14 11:39:35

mark,等我下午来做{:10_256:}

jhanker 发表于 2022-9-14 11:40:33

cnkizy 发表于 2022-9-14 11:39
mark,等我下午来做

好,多写几个字,就把鱼币给你了!

jhanker 发表于 2022-9-15 19:08:29

cnkizy 发表于 2022-9-14 17:05
首先我是小菜鸟哈,我的回答可能会让你失望。

我弄了很久没发现有啥问题呢,你发的贴子那个博 ...

这本书我有,谢谢推荐。不错!

jhanker 发表于 2022-9-16 08:27:45

cnkizy 发表于 2022-4-28 19:47
首先我是小菜鸟哈,我的回答可能会让你失望。

我弄了很久没发现有啥问题呢,你发的贴子那个博 ...

其实发该贴知识想把C语言中处理堆空间的方法给鱼油们普及一下而已

howzyao 发表于 2022-9-17 08:24:23

我来说说我的理解:

整型的 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
个地址无法访问了.

howzyao 发表于 2022-9-17 08:25:55

上图3地址,打字手误,3实际上是2

howzyao 发表于 2022-9-17 08:26:43

对了没有,有没有鱼币可接收,谢谢

jhanker 发表于 2022-9-30 10:47:54

howzyao 发表于 2022-9-17 08:26
对了没有,有没有鱼币可接收,谢谢

鱼币已经给人了!你到我其他的贴子里可以得到鱼币

howzyao 发表于 2022-10-5 15:23:10



做了一遍debug,得到的收获是:
1,声明指针数组的时候,并没有得到指向的内存空间.
2,当使用malloc时,返回的地址,才被赋值,而且malloc好像有"记忆"功能,能在下次使用时,接着上次的地址划分.
3,指针数组中的每个元素,都得到了3个int长度的空间.
水平不限,暂时还未发现其它悬念,但看指定下标,析构指针的用意,应当还有下文.

感谢楼主的悉心教学.
页: [1] 2
查看完整版本: 求救,调试下述代码,粗略理解堆内存的管理!