1,結(jié)構(gòu)體:
占多少內(nèi)存?
如下圖a,b,c三個變量。假如a占4個字節(jié),b占1個字節(jié),c占4個字節(jié)。那么struct wjb這個結(jié)構(gòu)體占多少內(nèi)存呢?
a是首地址,偏移量是0,b的偏移量是a,也就是4個字節(jié),c的偏移量是a+b,也就是5個字節(jié)。
結(jié)構(gòu)體的內(nèi)存占用計算方式是:最后地址的字節(jié)數(shù)+偏移量+填充字節(jié)(如果a+b的偏移量不是C的整數(shù)倍,將自動填充成c的整數(shù)倍,注意:每個變量的偏移量必須是自身所占字節(jié)的整數(shù)倍。)。最后計算出來結(jié)果是:4+1+(3)+4=12。
注意:如果計算出來的結(jié)果不是這個結(jié)構(gòu)體內(nèi)最寬的數(shù)據(jù)類型(這里是int)的字節(jié)數(shù)的整數(shù)倍,那么這個最寬的數(shù)據(jù)類型將自動填充字節(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)的變量用的是同一個地址,所占內(nèi)存是公用體內(nèi)最寬的那個變量的字節(jié)數(shù)。