初始化期间我的C堆栈指针可指向的最大内存位置

时间:2015-09-06 04:12:15

标签: c

在具有32位操作系统的Linux机器中考虑以下代码:

void foo(int *pointer){
  int *buf;
  int *buf1 = pointer;
  ....
}

使用上述声明(OS分配地址)buf和buf1可指向的最大内存地址是多少?例如,它能指向2 ^ 32-200吗?

我问的原因是我可能会对这些缓冲区进行指针运算,我担心这个指针算法可以回绕。例如,假设len小于buf和buf1的大小。假设some_pointer指向缓冲区的末尾。

unsigned char len = 255;
if(buf + len > some_pointer)
  //do something
if(buf1 + len > some_pointer)
  //do something

4 个答案:

答案 0 :(得分:3)

标准说

  1. 对于数组的两个元素,具有较低下标的元素的地址将始终与具有较高下标的对象的地址相比较少。
  2. 比较不属于同一聚合(数组或结构)的任何两个元素是未定义的行为
  3. 因此,如果buf + lensome_pointer指向与buf相同的数组中的元素(或者是数组之后的元素),则不必担心包裹arround。如果其中一个没有,那么无论如何都有未定义的行为

答案 1 :(得分:1)

您不应该依赖分配器提供的特定范围内的地址。即使您可以在特定的Linux设置上显示,malloc只能生成X和Y之间的地址,但无法保证 - 它可能会随着将来的更新而改变。 malloc的唯一保证是成功的分配不会从NULL开始(代码中的地址0,Linux和大多数其他典型平台)。

答案 2 :(得分:0)

是的,对于32位或64位操作系统。是否有任何可用的东西,或者如果您试图取消引用指针的访问冲突,则取决于编译器和操作系统。

答案 3 :(得分:0)

操作系统可以在地址空间的任何位置映射物理内存页面。您看到的地址根本不对应物理RAM芯片。例如,操作系统可能具有虚拟内存或写时复制页面。