1,結(jié)構(gòu)體:
占多少內(nèi)存项贺?
如下圖a,b,c三個(gè)變量。假如a占4個(gè)字節(jié)开缎,b占1個(gè)字節(jié)棕叫,c占4個(gè)字節(jié)奕删。那么struct wjb這個(gè)結(jié)構(gòu)體占多少內(nèi)存呢?
a是首地址伏钠,偏移量是0谨设,b的偏移量是a,也就是4個(gè)字節(jié)铝宵,c的偏移量是a+b,也就是5個(gè)字節(jié)鹏秋。
結(jié)構(gòu)體的內(nèi)存占用計(jì)算方式是:最后地址的字節(jié)數(shù)+偏移量+填充字節(jié)(如果a+b的偏移量不是C的整數(shù)倍,將自動(dòng)填充成c的整數(shù)倍横朋,注意:每個(gè)變量的偏移量必須是自身所占字節(jié)的整數(shù)倍百拓。)晰甚。最后計(jì)算出來結(jié)果是:4+1+(3)+4=12决帖。
注意:如果計(jì)算出來的結(jié)果不是這個(gè)結(jié)構(gòu)體內(nèi)最寬的數(shù)據(jù)類型(這里是int)的字節(jié)數(shù)的整數(shù)倍,那么這個(gè)最寬的數(shù)據(jù)類型將自動(dòng)填充字節(jié)地回。
#include<stdio.h>
struct wjb{
int a;
char b;
int c;
//char name[20];
//int price;
};
int main(){
struct wjb wjb_1 = {"wjb_name",1000};
printf("%s\n,%d\n",wjb_1.name,wjb_1.price);
struct wjb * w;
w = &wjb_1;
printf("name=%s\n",w->name);
struct wjb wjb_2[2]={{"aaa",100},{"bbb",200}};
struct wjb * p;
p=wjb_2;
printf("%s\n",p->name);
p++;
printf("%s\n",p->name);
return 0;
}
2,公用體:
公用體和結(jié)構(gòu)體的內(nèi)存占用不一樣畅买,公用體內(nèi)的變量用的是同一個(gè)地址细睡,所占內(nèi)存是公用體內(nèi)最寬的那個(gè)變量的字節(jié)數(shù)。