社区
Linux/Unix社区
帖子详情
关于内存分配
lysliberty
2004-07-07 04:29:49
用malloc分配了一块内存,获得该内存的起始地址为addr1=0x40007008
然后调用sbrk(0)获得堆顶的地址为:addr2=0x8053580。
由于动态内存在堆里分配,所以addr1应该小于addr2。
但是显然程序运行的结果是addr1>addr2!
这是怎么回事呀?
...全文
155
17
打赏
收藏
关于内存分配
用malloc分配了一块内存,获得该内存的起始地址为addr1=0x40007008 然后调用sbrk(0)获得堆顶的地址为:addr2=0x8053580。 由于动态内存在堆里分配,所以addr1应该小于addr2。 但是显然程序运行的结果是addr1>addr2! 这是怎么回事呀?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lysliberty
2004-07-10
打赏
举报
回复
ding
lysliberty
2004-07-10
打赏
举报
回复
ok, 下午看了一下源代码,终于知道为什么拉!
实际上,一个进程的内存空间分为
栈
未映射区域
堆
数据段
代码段
当分配小的内存段时,确实是在堆中分配
函数调用过程为:
malloc--->sys_brk()--->do_mmap()
但是,当分配大的内存段时(比一个页还大),就会直接调用do_mmap()在未映射区域中分配.可能是出于内存管理的需要吧.
多谢各位的关注!
yanedanny
2004-07-10
打赏
举报
回复
关注中。
lysliberty
2004-07-09
打赏
举报
回复
那楼上的是什么意思?
对每个进程来讲,堆栈只有一个呀!
lysliberty
2004-07-09
打赏
举报
回复
08048000-08049000 r-xp 00000000 03:07 32372 /home/liberty/test
08049000-0804a000 rw-p 00000000 03:07 32372 /home/liberty/test
0804a000-0804b000 rwxp 00000000 00:00 0
40000000-40015000 r-xp 00000000 03:05 600290 /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:05 600290 /lib/ld-2.3.2.so
40016000-4007a000 rw-p 00000000 00:00 0
42000000-4212e000 r-xp 00000000 03:05 957218 /lib/tls/libc-2.3.2.so
4212e000-42131000 rw-p 0012e000 03:05 957218 /lib/tls/libc-2.3.2.so
42131000-42133000 rw-p 00000000 00:00 0
bfffe000-c0000000 rwxp fffff000 00:00 0
这是我上面这个程序的maps文件.
lu_zi
2004-07-09
打赏
举报
回复
我个人认为不能这么说,要看操作系统的具体实现吧,单对一个堆或者栈来说你说的是成立的
CoolQ
2004-07-09
打赏
举报
回复
那就不知道了,你从源代码那里找答案吧
lysliberty
2004-07-09
打赏
举报
回复
ok!
但是动态内存总该在堆里分配吧?
还有,如果将
A=(char *)malloc(400000);
改为:
A=(char *)malloc(4000);
就不会出现上述问题,也就是说只有在分配大块内存的时候,才会出现这种情况。
CoolQ
2004-07-09
打赏
举报
回复
40016000-4007a000 rw-p 00000000 00:00 0真是很奇怪的一个段,不知道为什么在
40000000-40015000 r-xp 00000000 03:05 600290 /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:05 600290 /lib/ld-2.3.2.so
和
42000000-4212e000 r-xp 00000000 03:05 957218 /lib/tls/libc-2.3.2.so
4212e000-42131000 rw-p 0012e000 03:05 957218 /lib/tls/libc-2.3.2.so
之间?难道是静态编译的问题?
要不你还是看看glibc的malloc的源代码吧, 我印象中好像malloc也是调用的sbrk和brk来实现的呀
CoolQ
2004-07-08
打赏
举报
回复
addr1=0x40007008是怎么来的?
怎么感觉像是动态链接库的映射地址?
CoolQ
2004-07-08
打赏
举报
回复
你hook了?做不做到静态库没什么关系,连接的时候都连到你的代码里去了,你最好把代码弄出来看看。
wfu
2004-07-08
打赏
举报
回复
mark!
CoolQ
2004-07-08
打赏
举报
回复
那你把你的/proc/$you_pid/maps文件贴出来看看?
lysliberty
2004-07-08
打赏
举报
回复
原程序比较大, 下面这段代码同样可以说明问题:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main()
{
char *A;
A=(char *)malloc(400000);
printf("the address of A: %p\n",A);
printf("the address of sbrk: %p\n", (char *)sbrk(0));
free(A);
}
其最终的输出结果为:
the address of A: 0x40017008
the address of sbrk: 0x804b000
}
lysliberty
2004-07-08
打赏
举报
回复
sorry,表述不准确.
addr1应该是0x40017008,就是用malloc分配的.
注意: malloc不是标准库的那个,已经用hook改写过,并做到我自己的一个静态库里面了.
lysliberty
2004-07-07
打赏
举报
回复
各位大侠,帮帮忙呀!
lysliberty
2004-07-07
打赏
举报
回复
ding
C++第3课:C++内存泄露检测原理及案例实战
本课程具体的内容主要包括C++内存泄露案例、VS2015内存泄露检测、野指针、VirtualAlloc/HeapAlloc/malloc/new的区别、C++堆和栈的内存管理、栈简介、堆简介、堆与栈区别、栈的
内存分配
、Windows的虚拟内存技术、...
操作系统——内存管理之
内存分配
(分页,分段,段页)
最近分享了关于
内存分配
的相关知识,整理了一下PPT,总结成博客 在操作系统中,内存管理的目的是什么呢? 其中最主要的就是提高内存的利用率,所谓的提高内存利用率,就是尽可能的在内存中多存储进程,这就涉及到...
内存分配
方式与
内存分配
算法
内存分配
方式有两种,连续
内存分配
方式和离散
内存分配
方式。不同的分配方式又有不同的分配算法。
内存分配
算法,其实就是:有一大块空闲的资源,如何合理地分配资源?
内存分配
的思想可以用到很多其他的领域。比如...
C语言中
内存分配
在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。...第2节主要介绍C语言中
内存分配
及释放函数、函数的功能,以及如何调用这些函数申请
当退出 Python 时是否释放所有
内存分配
?
先给大家普及一波关于python关于
内存分配
释放的知识: 关于Python中的内存释放问题 首先就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。 下面是引用计数的...
Linux/Unix社区
23,125
社区成员
74,509
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章