|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 自己通过malloc或者VirtualAlloc申请的内存,地址是怎么样的?
我的收件箱(0)
共有
1414
人关注过本帖
标题:
自己通过malloc或者VirtualAlloc申请的内存,地址是怎么样的?
只看楼主
加入收藏
a451410
等 级:
论坛游民
帖 子:134
专家分:98
注 册:2018-3-4
结帖率:
84%
楼主
收藏
已结贴
√
问题点数:5 回复次数:4
自己通过malloc或者VirtualAlloc申请的内存,地址是怎么样的?
我想自己申请一块内存模拟堆栈变化用,所以我想知道申请后返回的地址是头还是尾?
意思就是,自己申请的内存应该是连续的吧?那么返回的地址是较小的地址还是较大的
地址,比如申请的空间是0x1-0x9,那返回的是0x1,还是0x9呢?
2025-03-26 22:26
举报帖子
使用道具
赠送鲜花
rjsp
等 级:
版主
威 望:
528
帖 子:9047
专家分:54195
注 册:2011-1-18
第
2
楼
收藏
得分:5
0x1
2025-03-27 08:10
举报帖子
使用道具
赠送鲜花
rjsp
等 级:
版主
威 望:
528
帖 子:9047
专家分:54195
注 册:2011-1-18
第
3
楼
收藏
得分:0
如果不是这样的话,那么 int* p = malloc( 2*sizeof(int) ) 之后,你只能这么用:
((int*)((char*)p + 1 - n*sizeof(int)))[0] = ……;
((int*)((char*)p + 1 - n*sizeof(int)))[1] = ……;
[此贴子已经被作者于2025-3-27 08:15编辑过]
2025-03-27 08:12
举报帖子
使用道具
赠送鲜花
a451410
等 级:
论坛游民
帖 子:134
专家分:98
注 册:2018-3-4
第
4
楼
收藏
得分:0
回复 2楼 rjsp
2025-03-31 21:21
举报帖子
使用道具
赠送鲜花
hoodlum1980
来 自:浙江大学
等 级:
论坛游民
威 望:
2
帖 子:294
专家分:23
注 册:2008-2-24
第
5
楼
收藏
得分:0
回复 楼主 a451410
(1)返回的地址值是这个内存的起始地址,你可以向里面写数据的地址,他是一段连续内存空间的起始位置(也就是地址值最低的位置),这个返回地址,你是可以向里面写入数据的,比如你申请了 16 个 bytes 的内存,那么返回值如果是 addr, 那么你得到的内存地址在 [addr, addr + 15] 区间内有效,你可以自由写入和读取。
(2)它实际位于你的进程的堆中。生命周期归你管理,意味着只要你不主动 free, virtualFree ,那么这个内存将一直有效。如果你本应该释放,但是因为编码的疏忽,忘了释放,这就叫内存泄露。
(3)这些堆内存分配函数,返回的地址通常有一个对齐,这意味着返回的地址的一般至少对齐到 DWORD,比如返回值绝对不会是诸如 0x00....01, 0x00....02, 0x00....03 这种值,意味着你可以直接把它强转成 DWORD* 而不会有任何问题。如果你需要对齐到更大的粒度,一般需要你自己的代码在申请时做一点特殊处理(比如多申请一些 bytes,然后把返回的地址,主动对齐到你需要的粒度,并记录下原始起始地址,因为释放的时候你需要传入的是最初返回的“未对齐”值)。
my tech blog: /hoodlum1980
2025-04-15 00:51
举报帖子
使用道具
赠送鲜花
5
1/1页
1
快速回复:
自己通过malloc或者VirtualAlloc申请的内存,地址是怎么样的?
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015389 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved