C 堆栈是否持续增长?

C 堆栈是否持续增长?,c,memory,stack,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); ++PointerToNum

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

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吗


因此,如果我指向数字\u 1,然后增加uint8类型的指针地址,那么它不应该指向数字\u 2,因为它是在数字\u 2之后声明的吗?

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

是未定义行为的原因。试图为任何行为辩护是毫无意义的。程序的行为可能会随着优化级别的更改、不同的编译器选项和不同的编译器而改变


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

这不是堆栈增长的方式问题,而是编译器如何选择排列局部变量的问题。两个变量之间可能有未使用的字节。。。而且也不能保证变量被放置在任何特定的位置或顺序,甚至根本不被包含(它们可以根据它们的使用方式进行优化)。你不能依赖于局部变量在内存中的位置,但是
number\u 2
可能位于
number\u 1
之后的下一个较低的地址。C语言中没有堆栈。您的代码调用未定义的行为。在C语言定义中没有提到堆栈。这是一个实施细节。同样,没有保证。尝试在启用优化的情况下编译,看看它是否仍然有效。另外,通过优化,我得到了您对原始代码期望的结果,因为我的编译器对变量的排序与您的不同。。。而且在优化的情况下,两者都不起作用。是的,我知道这一点。我只是想验证堆栈作为后进先出内存的整体概念。局部变量的放置与后进先出的堆栈无关。调用函数时通常发生的情况是调用方将参数和返回地址推送到堆栈上并调用函数。然后,被调用的函数将帧指针设置为堆栈指针的值。然后,堆栈指针按函数用于本地存储的空间量递减。局部变量被指定在该空间中的位置(表示为与帧指针的负偏移),但它们可以位于其中的任何位置。这完全取决于编译器。
++PointerToNumber;
printf("%d \n", *PointerToNumber);