我想知道为什么这段代码没有按预期工作。
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之后声明的吗?
答案 0 :(得分:3)
++PointerToNumber;
printf("%d \n", *PointerToNumber);
导致未定义的行为。试图证明任何行为都是毫无意义的。程序的行为可能会随着优化级别,不同编译器选项和不同编译器的更改而改变。
在这种情况下,优化器可以选择不为number_2
分配任何空间,因为它没有在函数中使用。
答案 1 :(得分:0)
正如有人评论的那样,数字2可能位于number_1之后的下一个较低地址。 因此,不是使用++ PointerToNumber,而是--PointerToNumber创建预期结果(打印“1”)。