找回密码
 欢迎注册
查看: 14905|回复: 4

[提问] malloc 出的地址最小为多少?

[复制链接]
发表于 2009-11-20 07:57:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
不知道有没有这样的标准规定,malloc 出的指针有什么限定范围? 不知这属于 C/C++ 标准还是 OS 系统方面的? 提此问的背景如下: 对于大整数来说,我们只要保存非零数据即可,尾部的连续零无须占用实际的空间。 一般的做法是单独用一个变量记录尾部连续零的数目。 现在我想换一种思路:设一个虚拟的“原点”指针,它相当于大整数的小数点位置, 对于移位运算来说,我单单只要将这个虚拟的“原点”指针反向偏移即可。 比如说,若想将大整数“左移”k“位”,那么我们只要将这个“虚拟的指针 -= k”即可。 关键是:不希望此过程中出现运算溢出的情况。因为指针间存在比较大小的运算。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-11-20 08:20:47 | 显示全部楼层
标准C/C++应该除了要求分配的指针值不等于NULL以外没有额外的要求。 此外,我们对malloc返回的指针还有一个对齐要求,比如现在的操作系统里面通常返回的地址值是8的倍数。 另外在Windows下,好像返回的地址值不会小于$10^6$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-11-20 08:36:52 | 显示全部楼层
一、在 C 中分为这几个存储区
  • - 由编译器自动分配释放
  • - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
  • 全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
  • 另外还有一个专门放常量的地方。- 程序结束释放
二、在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
  • ,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
  • ,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
  • 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
  • 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
  • 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-11-20 08:43:21 | 显示全部楼层
可以用下面的程序片段查询系统信息:
  1. SYSTEM_INFO sysInfo;
  2. GetSystemInfo(&sysInfo);
  3. cout<<"机器属性:"<<endl;
  4. cout<<"页大小="<<sysInfo.dwPageSize<<endl;
  5. cout<<"分配粒度="<<sysInfo.dwAllocationGranularity<<endl;
  6. cout<<"用户区最小值="<<sysInfo.lpMinimumApplicationAddress<<endl;
  7. cout<<"用户区最大值="<<sysInfo.lpMaximumApplicationAddress<<endl<<endl;
复制代码
在32位下的 windows 进程独享用户分区范围为:0x0001 0000~0x7FFE FFFF 也就是说,最小值可以为 0x0001 0000 = 65536, 这个值太小了,看来新的想法有局限性。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-11-20 09:42:25 | 显示全部楼层
如果你真想限制最小指针地址,可以在程序中将那些小的地址保留(通过VirtualAlloc函数)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 13:19 , Processed in 0.025155 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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