#include
#if 1
typedef struct mystruct
tests;
char *p;
char *q[20];
char *m[20][20];
int (*n)[10];
tests k;
#define title() printf("%-20s" " %-10s/n", "data type", "data size")
#define printsize(type) printf("%-20s"": %-10d/n", #type,sizeof(type))
void main(void)
#endif
該程式在我的機器(32位,p4)上的執行結果如下:
data type data size
int : 4
char : 1
short : 2
long : 4
double : 8
float : 4
long int : 4
long double : 8
long float : 8
p : 4
q : 80
m : 1600
n : 4
k : 32
press any key to continue
我們看到了這個結果, 其中有一項
k : 32
說明struct mystruct的大小是32bytes.
有些人會認為應該是24才對.
下面我們來分析一下為什麼會是32:
首先我來看以下結構:
typedef struct mystruct
tests;
double型別佔8bytes,這個是沒有問題的了 , 接下來 char型別佔1byte,short型別佔2bytes,int型別佔4bytes,
我們常認為在32位機上記憶體的對齊方式是4bytes(32位)對齊。使用我們認為的dda1和dda2佔4bytes, 這樣算下來就是8+4+8+4=24.
但是在這裡不是這樣的了,在這個結構裡有double 型別,它是乙個c的基本型別,在這裡記憶體的對齊方式是8bytes。這是因為
struct中的各成員變數的儲存位址有一套對齊的機制。這個機制概括起來有兩點:第一,每個成員變數的首位址,必須是它的型別的對齊值的整數倍,如果不滿足,它與前乙個成員變數之間要填充(padding)一些無意義的位元組來滿足;第二,整個struct的大小,必須是該struct中所有成員的型別中對齊值最大者的整數倍,如果不滿足,在最後乙個成員後面填充。
所以tests的大小是8+8+8+8=32
C語言中各種資料型別長度
c語言的基本資料型別有以下幾個 int 整型 char 字元型 float 單精度浮點型 double 雙精度浮點型 另外,在基本資料型別基礎上附加一些限定詞,得到擴充的資料型別。short,long可以應用到整型,unsigned可以應用到整型和字元型 short int 或short 短整型 l...
C語言中各種資料型別的大小
c語言 1.幾條規則 1 char型別一般是8bit,但ansi c裡沒有硬性規定其長度,某些嵌入式編譯器可能是16bit 2 short和long型別的長度不相同 3 int型別通常同具體機器的物理字長相同 4 short通常是16bits,int通常是16bits or 32bits每種編譯器可...
C語言中各種資料型別的大小
c語言 1.幾條規則 1 char型別一般是8bit,但ansi c裡沒有硬性規定其長度,某些嵌入式編譯器可能是16bit 2 short和long型別的長度不相同 3 int型別通常同具體機器的物理字長相同 4 short通常是16bits,int通常是16bits or 32bits每種編譯器可...