【发布时间】:2016-12-21 04:39:59
【问题描述】:
我想知道为什么这段代码没有按预期工作。
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 之后声明的吗?
【问题讨论】:
-
这不是堆栈增长方式的问题,而是编译器选择如何排列局部变量的问题。
-
两个变量之间可能有未使用的字节......并且不能保证变量被放置在任何特定的位置或顺序,甚至根本不被包含(它们可以根据具体情况进行优化)它们是如何使用的)。
-
你不能依赖局部变量在内存中的位置,但
number_2可能在number_1之后的下一个低地址。 -
C 语言中没有栈。您的代码调用了未定义的行为。
-
C语言定义中没有提到栈。这是一个实现细节。