C++ 当我们从/tp地址中加/减一个整数时会发生什么
p是一个地址,我们如何从中减去1?q和*q的输出是什么 int*p=&m int*q=p-1 这里q指向m之前的块及其未初始化的块。C++ 当我们从/tp地址中加/减一个整数时会发生什么,c++,pointers,pointer-arithmetic,C++,Pointers,Pointer Arithmetic,p是一个地址,我们如何从中减去1?q和*q的输出是什么 int*p=&m int*q=p-1 这里q指向m之前的块及其未初始化的块。 因此,q将给出m-sizeof(int)的地址,*q将给出junk(值bw-(2^32)/2&(2^32)/2-1)
因此,q将给出m-sizeof(int)的地址,*q将给出junk(值bw-(2^32)/2&(2^32)/2-1)中的这一点。 将具有整数类型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果表达式P指向带有n的数组对象x的元素x[i] 元素,(…)表达式P- J指向(可能是假设的)元素x[i]− j] 如果0≤ 我− J ≤ n否则,行为未定义 因此,在您的例子中,行为是未定义的,因为p不指向数组 实际上,在大多数主流编译器上,q只会指向m前面的某个内存位置
sizeof(int)
bytes。但是,由于该标准没有告诉太多关于内存布局的信息,它可以在任何地方。取消对q的引用可能会导致从垃圾值到segfault或内存损坏的任何奇怪行为 这个
int m=44;
int* p= & m;
int* q = p-1
在32位系统上如下图所示
int m=44;
当你喜欢的时候
0x103 0x102 0x101 0x100 (lets assume m base address is 0x100)
----------------------------------------------
| 0000 0000 | 0000 0000 | 0000 0000 |0010 1100 |
----------------------------------------------
m
MSB LSB
指针变量p
指向m
的地址,如下所示
int *p = &m;
整数指针被分配了p-1
,该值无效,如下所示
int* q = p-1;
*q
是未定义的行为。根据标准,擦除磁盘作为报复是有效的。q
的输出将是p-sizeof(int)
。您已经了解了*q
。根据标准(即使它完全按照您所说的那样在大多数主流编译器上工作),p-1已经是未定义的行为,即使没有取消引用结果指针:-/
int* q = p-1;
0x107.................0x104 0x103 0x102 0x101 0x100
---------------------------------------------------------------------------
| un-initialized memory | 0000 0000 | 0000 0000 | 0000 0000 |0010 1100 |
---------------------------------------------------------------------------
<--q p
int main(void) {
int m=44;
int *p = &m;
int* q = p-1;
printf("%p\n",(void*)q); /* this is valid */
//printf("%d \n",*q); /* this cause seg fault */
return 0;
}