c語言---結(jié)構(gòu)體空間大小如何計(jì)算的
結(jié)構(gòu)體空間大小如何計(jì)算的?
首先,有如下結(jié)構(gòu)體: ????????????????????? ?
struct?xx
{
int?a;
char?b;
short?c;
};
對于上面這個(gè)結(jié)構(gòu)體的大小,也許你跟我一樣是這樣計(jì)算的:
int? ?a;----->? 4 個(gè)字節(jié)? ?char? ?b; ------>1個(gè)字節(jié)? ? ? ?short? c;----->2個(gè)字節(jié)
(我這里所用的是64位系統(tǒng),所以int? a;是4個(gè)字節(jié)。)所以,計(jì)算出來,結(jié)構(gòu)體的空間大小是:4 + 1 +2 = 7字節(jié),可答案是8字節(jié)。
計(jì)算步驟:
(1)先假設(shè)結(jié)構(gòu)體中首個(gè)元素(如int a;)的第一個(gè)地址是0x0;
(2)元素本身的地址除以偏移量是一個(gè)整數(shù),即要存放元素的那個(gè)內(nèi)存地址 % 其本身的字節(jié)大小 ==0,如果取余數(shù)不等于零,則下個(gè)內(nèi)存地址繼續(xù)取余數(shù),若等于零,則存放該元素;
(3)存放完所有元素后,計(jì)算這塊內(nèi)存的大小, 若結(jié)果 除以結(jié)構(gòu)體元素中字節(jié)最大的那個(gè)數(shù) 是一個(gè)整數(shù),則結(jié)構(gòu)體的大小就是該結(jié)果。若不能整除,則結(jié)果加到整除的那個(gè)數(shù),那么這個(gè)數(shù)就是結(jié)構(gòu)體空間的大小。(比如:經(jīng)過3步的計(jì)算,得到的結(jié)果是9,而上面元素最大字節(jié)數(shù)是4,但9不能整除4,所以9加到12才可以整除4,所以結(jié)構(gòu)體空間的大小為12。再若計(jì)算得到的結(jié)果是8,可以整除4,所以結(jié)構(gòu)體空間的大小為8字節(jié)。
圖片分析如下:

驗(yàn)證:
#include <stdio>
int main()
{
struct xx
{
int a;
char b;
short c;
};
printf("結(jié)構(gòu)體xx 的空間大小是:%ld字節(jié)\n",sizeof(struct xx ));
return 0;
}

例外:

