檢查下面的程式,
int main()
{
short int data1[]={1,2,3,4,5,6,7,8,9,10};
short int data2[]={1,2,3,4,5,6,7,8,9,10};
short int *ptr = data1;
cout<<"data1 start addr = "<<data1<<endl;
cout<<"data2 start addr = "<<data2<<endl;
for (int i=0;i<20;i , ptr )
cout <<"Data = "<<*ptr<<" Addr = "<<ptr<<endl;
return 0;
}
在上面的程式中,即使陣列大小是 10,在第一個陣列之后,堆疊中正好保留了 6 個額外的位置(12 位元組),我想知道為什么要保留這個額外的空間?并且這個額外的空間大小因不同的大小而異(大小為 20 的不是 12)。任何人都可以解釋這些分配背后的概念嗎?
使用 g /gcc 的上述程式的輸出是,
data1 start addr = 0x7ffc87350920
data2 start addr = 0x7ffc87350940
Data = 1 Addr = 0x7ffc87350920
Data = 2 Addr = 0x7ffc87350922
Data = 3 Addr = 0x7ffc87350924
Data = 4 Addr = 0x7ffc87350926
Data = 5 Addr = 0x7ffc87350928
Data = 6 Addr = 0x7ffc8735092a
Data = 7 Addr = 0x7ffc8735092c
Data = 8 Addr = 0x7ffc8735092e
Data = 9 Addr = 0x7ffc87350930
Data = 10 Addr = 0x7ffc87350932
Data = 32629 Addr = 0x7ffc87350934
Data = 0 Addr = 0x7ffc87350936
Data = 9232 Addr = 0x7ffc87350938
Data = 12176 Addr = 0x7ffc8735093a
Data = 22064 Addr = 0x7ffc8735093c
Data = 0 Addr = 0x7ffc8735093e
Data = 1 Addr = 0x7ffc87350940
Data = 2 Addr = 0x7ffc87350942
Data = 3 Addr = 0x7ffc87350944
Data = 4 Addr = 0x7ffc87350946
uj5u.com熱心網友回復:
您不能期望專案在堆疊上的分配順序與它們在代碼中定義的順序相匹配,除非您明確指定欄位應如何相對于彼此存盤的結構。出于性能或其他原因,編譯器可以并且確實對元素進行重新排序。
如果不檢查組件以了解它們是如何使用的,就無法確定這些專案是什么。讀取它們是未定義的行為,因為您無法在編譯時知道它們將是什么,或者它們是否甚至代表有效記憶體,因為它超出了您定義的任何變數的范圍。奇怪的是,它們只是程式中的其他變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/449581.html
上一篇:獲取上一行的第一個字符
下一篇:Linuxfind命令解釋
