[英]How do arrays with length defined by variables in C get stored in memory?
[英]How variables get stored in memory in C, According to their types
因此,我試圖了解C如何將我的變量存儲在內存中,並且在遇到這個問題之前,我一直做得很好:
我寫了下面的簡單程序,告訴我變量在哪里被逐一存儲,這樣我就可以知道類型之間的區別,但是我無法使任何鏈接的數量看起來如此任意,同時我相信它必須做類型。 那么,有什么線索可以解釋為什么即使最后聲明了字符,字符也總是會得到較低的內存地址?
int main ()
{
int integer1 = 6;
int integer2 = 2;
int integer3 = 3;
char character1 = 'C';
char character2 = 'B';
char character3 = 'D';
char string1[4] = "Hi!";
char string2[4] = ":D";
char string3[4] = "ack!";
printf ("integer1 : %d, at %p\n", integer1, &integer1);
printf ("integer2 : %d, at %p\n", integer2, &integer2);
printf ("integer3 : %d, at %p\n", integer3, &integer3);
printf ("character1 : %c, at %p\n", character1, &character1);
printf ("character2 : %c, at %p\n", character2, &character2);
printf ("character3 : %c, at %p\n", character3, &character3);
printf ("string1 : %s, at %p\n", string1, string1);
printf ("string2 : %s, at %p\n", string2, string2);
printf ("string3 : %s, at %p\n", string3, string3);
}
輸出:
integer1 : 6, at 0x7ffe40915b40
integer2 : 2, at 0x7ffe40915b44
integer3 : 3, at 0x7ffe40915b48
character1 : C, at 0x7ffe40915b3d
character2 : B, at 0x7ffe40915b3e
character3 : D, at 0x7ffe40915b3f
string1 : Hi!, at 0x7ffe40915b4c
string2 : :D, at 0x7ffe40915b50
string3 : ack!, at 0x7ffe40915b54
編輯:編譯器:GCC 7.3.0
內存中變量的順序是編譯器的實現細節。 無法保證其外觀。
話雖這么說,看來編譯器正在嘗試對變量進行布局,以使所有變量都正確對齊而在它們之間沒有任何填充,即這樣做是為了節省空間。
請記住,您正在處理自動變量。 對於自動變量的實現方式,沒有正式的規范,但是在任何系統中,您都可能會發現它們將在堆棧中。
(假設沒有優化)
如果查看main()函數(通常為-S選項)的生成代碼,則可能會找到類似以下內容的語句
MOV SP, BP
DECL #SOMENUMBER, SP
其中SOMENUMBER是您的主要功能局部變量所需的字節數。
然后,編譯器為每個變量分配SP寄存器的偏移量。 看起來像這樣:
1(SP) ; is character1
2(SP) ; is character2
3(SP) ; is character3
4(SP) ; is integer1
8(SP) ; is integer2
12(SP) ; is integer3
16(SP) ; is string1
20(SP) ; is string2
24(SP) ; is string3
堆棧通常向下增長,因此較低的變量地址將具有較小的偏移量。
然后,編譯器需要初始化堆棧上的每個位置。
編譯器的分配器將弄清楚如何執行此映射。 您需要查看GCC代碼以弄清楚它為什么走這條路。
投入
short short1 ;
long long long1 ;
char str[] = "12345" ;
可能會給您一些有趣的結果,以了解不同大小如何影響分配器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.