乙個測試 C語言中各種資料型別的簡單函式實現

2021-05-22 06:01:24 字數 1557 閱讀 8506

#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每種編譯器可...