1. 程式人生 > >區域性變數記憶體分配詳解

區域性變數記憶體分配詳解

#include <stdio.h>
int main()
{
#if 1
    int a;
    char b;
    int c;
    char d;

    a=1;
    b='2';
    c=3;
    d=4;

    printf("0x%x 0x%x   0x%x  0x%x\n ", &a, &b,&c,&d);
#else


    char b;
    int a;
    int c;
    int d;


    b=2;
    a=1;
    c=3;
    d=4;
    printf("0x%x 0x%x   0x%x  0x%x\n ", &a, &b,&c,&d);



#endif

    return 0;
}

區域性變數在記憶體棧中是怎樣儲存的? 會有資料對齊嗎?

帶著這個思考做了個小測試,如上程式碼,列印結果如下

[[email protected] endian]$ ./a.out 

0xdb53c19c 0xdb53c19b   0xdb53c194  0xdb53c193

如果不理解為什麼地址是這樣分配的,繼續向下看。


棧是從高地址向地址進行分配的(不清楚的可以仔細研究下 程式設計師的自我修養)。

所以變數a的地址 為0xdb53c19c; 這個地址其實是儲存變數a的起始地址,就是最低地址 變數a儲存是在 0xdb53c19f-0xdb53c19c 之間的,佔用四個位元組。

所以變數b的地址 為0xdb53c19b; 這個地址其實是儲存變數a的起始地址,就是最低地址 變數a儲存是在 0xdb53c19c-0xdb53c19b之間的,佔用一個位元組。

所以變數c的地址 為0xdb53c194; 這個地址其實是儲存變數a的起始地址,就是最低地址 變數a儲存是在 0xdb53c198-0xdb53c194之間的,佔用四個位元組。有人會問為什麼變數b和c之間不是連續的,這個就是因為位元組對齊的了,可以看下文章(http://www.cnblogs.com/wuyudong/p/memory-alignment.html)介紹位元組對齊的比較好。 下個地址必須為4的倍數,所以0xdb53c19b補了三個位元組。

這樣解釋了為什麼有些編碼規範中建議的相同結構的定義在一起,不僅是美觀,而且節省記憶體。