在具有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
答案 0 :(得分:3)
标准说
因此,如果buf + len
和some_pointer
指向与buf
相同的数组中的元素(或者是数组之后的元素),则不必担心包裹arround。如果其中一个没有,那么无论如何都有未定义的行为。
答案 1 :(得分:1)
您不应该依赖分配器提供的特定范围内的地址。即使您可以在特定的Linux设置上显示,malloc
只能生成X和Y之间的地址,但无法保证 - 它可能会随着将来的更新而改变。 malloc
的唯一保证是成功的分配不会从NULL
开始(代码中的地址0,Linux和大多数其他典型平台)。
答案 2 :(得分:0)
是的,对于32位或64位操作系统。是否有任何可用的东西,或者如果您试图取消引用指针的访问冲突,则取决于编译器和操作系统。
答案 3 :(得分:0)
操作系统可以在地址空间的任何位置映射物理内存页面。您看到的地址根本不对应物理RAM芯片。例如,操作系统可能具有虚拟内存或写时复制页面。