鱼C论坛

 找回密码
 立即注册
查看: 6570|回复: 27

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

[复制链接]
发表于 2022-4-28 19:47:09 | 显示全部楼层 |阅读模式
60鱼币
本帖最后由 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;
}
最佳答案
2022-4-28 19:47:10
本帖最后由 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

no_continue.png

分配之前堆内存:
image-20220914162535077.png

释放内存之后:
image-20220914162555573.png


中午在看到你这个问题的时候,我想起了最近在看的书,相当不错。
《程序员的自我修养—链接、装载与库》
你看首页
1.1.png
是不是吊足了你的胃口。

可惜的是,书上关于malloc这一块,也就是312页,10.3.4这一节,并未给出明确答案,只是告诉读者,malloc有自己的算法,申请的空间不仅仅是程序员给出的这一点东西。
它提出的是一个很简单的模型
image-20220914170816465.png


继续探讨下呢

最佳答案

查看完整内容

首先我是小菜鸟哈,我的回答可能会让你失望。 我弄了很久没发现有啥问题呢,你发的贴子那个博主说的问题,很明显的问题,hello world! 的长度是12,但字符串后面还有一个\0结尾,strlen的结果是12,但strcpy会把\0也复制过去,带上这玩意,它长度就是13了,然后写到后面的下溢标志里,就有错了。 1.两图中未说明的数据表示什么? 未说明的数据 是指? 2.回收空间的数据块大小好像块中没有指示?(free后,由于 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-28 19:47:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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

no_continue.png

分配之前堆内存:
image-20220914162535077.png

释放内存之后:
image-20220914162555573.png


中午在看到你这个问题的时候,我想起了最近在看的书,相当不错。
《程序员的自我修养—链接、装载与库》
你看首页
1.1.png
是不是吊足了你的胃口。

可惜的是,书上关于malloc这一块,也就是312页,10.3.4这一节,并未给出明确答案,只是告诉读者,malloc有自己的算法,申请的空间不仅仅是程序员给出的这一点东西。
它提出的是一个很简单的模型
image-20220914170816465.png


继续探讨下呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-28 22:06:02 | 显示全部楼层
已分配堆空间结构图:
堆.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-28 22:07:11 | 显示全部楼层
回收堆空间结构图:
堆1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-28 22:09:32 | 显示全部楼层
本帖最后由 jhanker 于 2022-4-29 00:07 编辑

但现在有几个问题:
1.两图中未说明的数据表示什么?
2.回收空间的数据块大小好像块中没有指示?(free后,由于p[3],p[4]指向的空间是连续的。所以会直接合并,在堆内存中可以看到)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-29 00:36:19 | 显示全部楼层
进一步探索:

内存

内存

结构

结构
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-29 00:40:35 | 显示全部楼层
网上对堆结构的分析:
堆的理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-25 16:39:40 | 显示全部楼层
好东西没人看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-31 14:44:28 | 显示全部楼层
什么时候才能确认最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-3 09:36:51 | 显示全部楼层
【已收藏】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-14 10:28:00 | 显示全部楼层
有没有人回复一下,我可以把鱼币给他
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-14 11:39:35 | 显示全部楼层
mark,等我下午来做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-14 11:40:33 | 显示全部楼层
cnkizy 发表于 2022-9-14 11:39
mark,等我下午来做

好,多写几个字,就把鱼币给你了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-15 19:08:29 | 显示全部楼层
cnkizy 发表于 2022-9-14 17:05
首先我是小菜鸟哈,我的回答可能会让你失望。

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

这本书我有,谢谢推荐。不错!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-16 08:27:45 | 显示全部楼层
cnkizy 发表于 2022-4-28 19:47
首先我是小菜鸟哈,我的回答可能会让你失望。

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

其实发该贴知识想把C语言中处理堆空间的方法给鱼油们普及一下而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
个地址无法访问了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-17 08:25:55 | 显示全部楼层
上图3地址,打字手误,3实际上是2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-17 08:26:43 | 显示全部楼层
对了没有,有没有鱼币可接收,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-30 10:47:54 | 显示全部楼层
howzyao 发表于 2022-9-17 08:26
对了没有,有没有鱼币可接收,谢谢

鱼币已经给人了!你到我其他的贴子里可以得到鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-5 15:23:10 | 显示全部楼层
sshot-6.png

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

感谢楼主的悉心教学.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表