免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4104 | 回复: 7
打印 上一主题 下一主题

heap有什么作用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-12 19:17 |只看该作者 |倒序浏览
不好意思,翻了以前的帖子,还是没怎么看懂。


  1. char array[1024];
  2. char *p = ( char *)malloc(1024);
  3. p = array;
复制代码


malloc()是在heap给指针分了1024大小的空间,array[]是在stack上,
然后p指向array,我的测试机器 Intel+linux2.4
地址空间大概是:&array = 0xbffff1a0(后三位不断变化)
&p = 0xbffff19c
p = 0xbffff1a0(同array的地址)

那么,heap的地址怎么看?p用malloc分配的1024bytes有什么作用?因为它已经指向stack中的array了,难道heap中的1024  和 stack中array的1024 去对应?
另外,在elf可执行文件执行时,heap和数据段是完全靠在一起的吧?有标记区分它们吗?

论坛徽章:
0
2 [报告]
发表于 2006-01-12 19:59 |只看该作者
>> p用malloc分配的1024bytes有什么作用?因为它已经指向stack中的array了
没用。 这这个“没用”是你的程序制造的, 叫做“内存泄漏”

>> heap和数据段是完全靠在一起的吧?有标记区分它们吗?
印象里是, ELF的bss、data这些区, 在加载时为HEAP;然后就看你是否malloc/new/brk往上张了, 不长的话,HEAP就只这么大了 。

论坛徽章:
0
3 [报告]
发表于 2006-01-12 22:34 |只看该作者
heap 是指进程的地址空间用于动态分配的部分.

程序启动时, loader (ld.so) 根据可执行文件的要求(起始地址, 对齐大小) 把disk 上的可执行文件 mmap 到进程的地址空间. heap就紧接上面用到的地址空间(一般是bss之后), 往上涨.

论坛徽章:
0
4 [报告]
发表于 2006-01-13 08:40 |只看该作者
我的例子可能有点问题,换个方式

  1. char array[1024];
  2. char *p = ( char *)malloc(1024);
  3. memcpy(p,array,sizeof(array));
复制代码

这个问题的起源是我想确认程序中的堆栈段,heap区,数据段,文本段各自大概的地址空间。
因为heap与堆栈看似好像一致,可资料上都显示有很大区别,但heap只给指针malloc用,但指针却有实际指向的内容,比如例子中的array,那么heap中给它分配的空间是什么作用?

btw:不同意斑竹“内存泄漏”的解释,因为程序后面加free()即可。
多谢两位回复,不过两位对于heap与可执行文件的解释有点相反:
elf的.bss,.text是要被map到heap内?还是在内存中heap在这两者之上?
我觉得后者比较合理!

论坛徽章:
0
5 [报告]
发表于 2006-01-13 08:51 |只看该作者
char array[1024];
char *p = ( char *)malloc(1024);
p = array;
你的代码的第三句已经把stack的地址赋给了p,把p里面存的以前的heap的地址冲掉了!

论坛徽章:
0
6 [报告]
发表于 2006-01-13 09:29 |只看该作者
0x00000000
...........
.text
.data
.bss
heap
||
\/
.
.

/\
||
staclk
....
0xFFFFFFFF

论坛徽章:
0
7 [报告]
发表于 2006-01-13 11:40 |只看该作者
char *p = ( char *)malloc(1024);
p = array;

就这两行代码一执行, 谁还能free? 不泄漏的就怪了

论坛徽章:
0
8 [报告]
发表于 2006-01-13 12:02 |只看该作者
噢,懂了。
多谢各位。
我想我跑到stack胡同里去了,有些知识到了必要的阶段才有必要去深究!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP