簡體   English   中英

如何根據變量的類型將變量存儲在C中的內存中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM