堆栈是否持续增长?

时间:2016-08-14 22:33:59

标签: c memory stack

我想知道为什么这段代码没有按预期工作。

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之后声明的吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

正如有人评论的那样,数字2可能位于number_1之后的下一个较低地址。 因此,不是使用++ PointerToNumber,而是--PointerToNumber创建预期结果(打印“1”)。