C++ 当我们从/tp地址中加/减一个整数时会发生什么

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)

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)中的这一点。 将具有整数类型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果表达式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;
}