免费注册 查看新帖 |

Chinaunix

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

[C] [C语言]关于scanf对malloc申请内存的影响的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-09 10:07 |只看该作者 |倒序浏览
学习c语言中,遇到问题:
windows下:
1)续两次malloc,可以得到连续的内存;但是如果中间隔了scanf函数,分配不连续了,而且后面一个malloc分配的内存地址比第一个变小了,堆分配内存地址不是向上增长的么?
2)我malloc(20) 怎么看连续分配地址差 怎么有40?
代码有损版容,就不贴了。

论坛徽章:
0
2 [报告]
发表于 2006-12-09 11:03 |只看该作者
这涉及到malloc的分配算法,而各个编译器的实现又不尽相同,得自己去看源代码了。

论坛徽章:
0
3 [报告]
发表于 2006-12-10 09:28 |只看该作者
那第二个问题,也是和编译器相关么,没有linux环境无法用gcc验证一下。那位老大给解释一下,多谢了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-12-10 11:11 |只看该作者
原帖由 玄铁寒冰 于 2006-12-10 09:28 发表
那第二个问题,也是和编译器相关么,没有linux环境无法用gcc验证一下。那位老大给解释一下,多谢了。


question,如果你是OS,别人向你malloc无数个内存块,不时的还要free。你怎么管理?

很简单,OS一定会占用一部分空间(一般是你malloc得到的内存的前面一小部分内存头)来记录一些信息,比如这次malloc的是多大啊,地址是多少啊,这样它才能管理好内存。而free的时候,你只需要给它一个pointer,OS自动就会找到这个内存头,然后进行有效的管理。

论坛徽章:
0
5 [报告]
发表于 2006-12-10 13:33 |只看该作者
好像现在用malloc没有什么机制可以保证我两次分配的内存是连续的,即便是连续的,在编程的时候也不能这样假设吧,用sbrk也许可以。但是在Linux下sbrk也是一个libc的wapper而已。

论坛徽章:
0
6 [报告]
发表于 2006-12-10 14:46 |只看该作者
原帖由 aero 于 2006-12-10 11:11 发表


question,如果你是OS,别人向你malloc无数个内存块,不时的还要free。你怎么管理?

很简单,OS一定会占用一部分空间(一般是你malloc得到的内存的前面一小部分内存头)来记录一些信息,比如这次malloc的是 ...

小声说一句,malloc 记录的那些信息不是 OS 管的...

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
7 [报告]
发表于 2006-12-10 15:22 |只看该作者
原帖由 wsw1wsw2 于 2006-12-10 13:33 发表
好像现在用malloc没有什么机制可以保证我两次分配的内存是连续的,即便是连续的,在编程的时候也不能这样假设吧,用sbrk也许可以。但是在Linux下sbrk也是一个libc的wapper而已。


物理地址不保证连续,但是虚拟地址层面上,为什么不可以是连续的?
不过,呵,这个问题还是每个实现相关的。
malloc采用的分配算法有不少,每个系统都可以选择适合自己的算法。
首先 以每个进程的观点来看 ,3G是它独占的资源,那么只要算法是连续分配的,那么你得到的就是连续地址。
再次 是否连续要看你申请的内容大小,因为下面可能需要圆整操作以对其字节。
最后 一切都看malloc算法如何实现。

[ 本帖最后由 gvim 于 2006-12-10 15:31 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-12-10 15:27 |只看该作者
malloc是标准库地实现,只要明确说了的才是可以的,

malloc没有说非要连续,所以甚至可以忽高忽低
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP