區域性變數記憶體分配詳解
阿新 • • 發佈:2019-01-28
#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補了三個位元組。
這樣解釋了為什麼有些編碼規範中建議的相同結構的定義在一起,不僅是美觀,而且節省記憶體。