c語言中結構的sizeof如何計算

2021-08-28 02:52:35 字數 1324 閱讀 7143

演算法思路:

1. offset設定為0. offset就是分配空間的偏移量

2. 依次對結構裡面的每個成員p進行下面的計算。如果計算完畢,跳到第7步。

2. 計算temp=min(p的對齊引數,系統對齊引數)。p如果是內建資料型別,對齊引數有編譯器給出。比如char的對齊引數是1等等。系統對齊引數由#pragram pack(n)設定,預設為8。如果p本身是資料結構,p裡面最大的成員對齊引數就是p的對齊引數。

3. 如果offset/temp=0,意味著可以整除,跳到第5步

4. 如果offset/temp!=0,意味著不能整除,調整offset(增加乙個小於temp的大小),使得其可以整除temp

5. 給當前成員分配空間,也就是offset加上當前成員的實際大小,比如int的話就是4,double就是8,結構的話就是結構自己的sizeof()大小。

6. 跳到第2步

7. 最後需要保證:offset需要整除當前結構的對齊引數

#include 

#define pack_default 8 //系統預設對齊引數,通過#pragram pack(n)來設定,預設是8

#define char_t 1 //char的自身對齊引數,和編譯器有關係

#define int_t 4 //int的自身對齊引數,和編譯器有關係

#define short_t 2 //short的自身對齊引數,和編譯器有關係

#define float_t 4 //float的自身對齊引數,和編譯器有關係

#define double_t 8 //double的自身對齊引數,和編譯器有關係

#define long_t 4 //long的自身對齊引數,和編譯器有關係

int getsize(int *a, int size)

//給當前變數分配空間

offset+=p;

//尋找整個結構的最大對齊引數

pack_max=max(temp,pack_max);

}//整個結構的空間大小需要整除最大對齊引數

if(offset%pack_max)

return offset;

}int main(int argc, char *argv)

; int s2=;

printf("sizeof(s1)=%d, sizeof(s2)=%d \n",

getsize(s1,sizeof(s1)/sizeof(int)),

getsize(s2,sizeof(s2)/sizeof(int)));

return

0;}

c語言中的sizeof

一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...

C語言中的sizeof

一 sizeof是編譯器的內建指示符 不是函式 sizeof用於計算型別或變數所佔的記憶體大小 sizeof的值在編譯期就已經確定 sizeof用於型別 sizeof type sizeof用於變數 sizeof var 或 sizeof var int var 0 printf d n sizeo...

c語言中的sizeof

首先,sizeof是c語言的一種單目操作符,以位元組的形式給出了其運算元的儲存大小,其返回值為size t,在64位機器下被定義為long unsigned int。sizeof測的大小,在不同的機器上可能不一樣,sizeof不能傳函式。1.基本資料型別 include include intmai...