結構體成員的儲存

2021-08-03 15:42:22 字數 1410 閱讀 3337

剛開始學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 細節方面的問題,其中遇到了一道關於結構體在記憶體儲存的問題,老師先後變換了這幾種種情況,最後一種情況還是沒有回答...