我想知道爲什麼這段代碼沒有按預期工作。堆棧是否連續增長?
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之後聲明的?
這不是堆棧增長的問題,而是編譯器如何選擇排列局部變量的問題。 –
兩個變量之間可能有未使用的字節......並且不能保證變量被放置在任何特定的位置或順序中,或者甚至被包括在內(根據它們的使用方式,它們可以被優化)。 – Dmitri
不能依賴於局部變量在內存中的位置,但'number_2'可能位於'number_1'後面的下一個較低地址處。 –