我想知道为什么此代码无法按预期工作。
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
分配任何空间,因为该函数未使用该空间。