剛開始學c語言只知道怎麼引用結構體成員變數,但卻很少關注結構體成員的儲存,儲存涉及到了記憶體對齊相關的知識,要能很準確的引用結構體成員變數也需要學習一下它的儲存。
#includetypedef struct node
node,*pnode;
int main()
; pnode p=&nodetest;
printf("%d\n",p->a);
printf("%s\n",&(p->a)+1);
printf("%s\n",p->str);
printf("%s\n",&(p->a)+2);
printf("%d\n",sizeof(nodetest));
return 0;
}
列印:100
b12
通過列印結果可以看出,結構體裡面的成員變數是儲存在相鄰的記憶體中。按記憶體對齊原則,其中成員a佔4個位元組,成員str和c一起共佔4個位元組,str1成員也佔4個位元組,所以一起佔12個位元組,與sizeof()函式的結果剛好一致。但是上述列印結果又乙個問題,printf("%s\n",&(p->a)+2)結果為空,這是什麼原因呢?不過首先說一下&(p->a)+2到底移動了幾個位。其實它是移動了8個位。成員a佔4個位元組,則&(p->a)沒加1是前進4個位元組。那麼按照記憶體對齊原則,則應該剛好列印成員str1的值啊,什麼原因呢?繼續看
#includetypedef struct node
node,*pnode;
int main()
; pnode p=&nodetest;
printf("%s\n",&(p->a)+2);
return 0;
}
列印:23
從列印結果可以看出,&(p->a)+2已經指向str1中'2'對應的位址。指標在偏移的時候沒有考慮記憶體對齊兒空缺的那乙個位元組,所以最後導致偏移多了一位,這樣就造成了上面的列印結果為空。
在工作中,我們通常要在別人的**中增加新的功能,在增加功能的過程中可能要向結構體中增加新的成員變數。由於記憶體儲存是連續的,所以不能從結構體中間增加變數,因為這樣會造成賦值混亂,出現記憶體溢位。正確的做法是新增新成員到結構體的尾部。
#includetypedef struct node
node,*pnode;
int main()
; pnode p=&nodetest;
printf("%d\n",p->a);
printf("%s\n",p->str);
printf("%c\n",p->c);
printf("%s\n",p->str1);
return 0;
}
列印:100bm
如果列印str2,其結果也是空
結構體成員的引用
有下面幾個結構體 struct 是個結構標籤 struct x struct y 20 z 或者typedef struct 是個型別名 x y 20 z struct complex struct complex comp 結構體成員直接訪問 comp.sa 4 c 結構體成員的間接訪問 當擁有乙...
結構體互為成員
我定義了兩個型別 typedef stuct aaa,paaa typedef struct bbb,pbbb 這樣兩個型別怎麼宣告?struct aaa struct bbb typedef aaa paaa typedef bbb pbbb struct aaa struct bbb 至少有乙個...
結構體儲存
struct a sizeof struct a struct b sizeof struct b struct c sizeof struct c 和老師交流時,老師給我出了幾道c c 細節方面的問題,其中遇到了一道關於結構體在記憶體儲存的問題,老師先後變換了這幾種種情況,最後一種情況還是沒有回答...