我想知道为什么此代码无法按预期工作。

typedef char uint8;

  int main(int argc, const char * argv[]) {
  // insert code here...

  uint8 number_1 = 3;
  uint8 number_2 = 1;
  uint8 *PointerToNumber = &number_1;

  printf("%d \n", *PointerToNumber);
  ++PointerToNumber;
  printf("%d \n", *PointerToNumber);

  return 0;
}


该程序打印3和-112。但是,如果堆栈不断增长,是否应该打印3和1?

因此,如果我指向number_1,然后增加uint8类型的指针地址,是否应该指向number_2,因为它是在number_2之后声明的?

最佳答案

++PointerToNumber;
printf("%d \n", *PointerToNumber);


是导致未定义行为的原因。试图证明任何行为是没有意义的。程序的行为可能会随着优化级别,不同的编译器选项和不同的编译器的更改而改变。

在这种情况下,优化器可以选择不为number_2分配任何空间,因为该函数未使用该空间。

07-24 09:48