C語言sizeof

sizeof,顧名思義,是描述一個數據類型的size的,也就是大小

簡單地說,其作用就是返回一個對象或者類型所佔的內存字節數。開始我還以爲它是簡簡單單的一個函數而已,在瞭解後才發現,它的學問多着呢!

首先,sizeof有三種語法形式,分別如下:

  1. sizeof( object ); // sizeof( 對象 );

  2. sizeof( type_name ); // sizeof( 類型 );

  3. sizeof object; // sizeof 對象;

也就是說,不能寫成sizeof int;形式

實際上,sizeof計算對象的大小也是轉換成對對象類型的計算,也就是說,同種類型的不同對象其sizeof值都是一致的。

這裏,對象可以進一步延伸至表達式,即sizeof可以對一個表達式求值,編譯器根據表達式的最終結果類型來確定大小,一般不會對錶達式進行計算。如:

sizeof(2);由於2是int數據類型,所以也相當於sizeof(int);

再比如sizeof(2+2.11);由於2.11是double數據類型,所以也相當sizeof(double);

sizeof也可以對一個函數調用求值,其結果就是函數返回數據類型的大小,這裏就不做例子了。

下面我們再來看一下基本數據類型的sizeof:

32位操作系統裏

char:1個字節 short int:2個字節

int:4個字節 unsigned int:4個字節

float:4個字節 double:8個字節

long:4個字節 unsigned long:4個字節

long long:8個字節 *:4個字節

64位操作系統裏

char:1個字節 short int:2個字節

int:4個字節 unsigned int:4個字節

float:4個字節 double:8個字節

long:8個字節 unsigned long:8個字節

long long:8個字節 *:8個字節

數組的sizeof

數組的sizeof等於數組所佔用的內存字節數,如:

char a1[]=“abc”; 那麼sizeof(a1)爲4。因爲

字符串結尾還有一個NULL終止符

int a2[3];那麼結果sizeof(a2)爲3*4爲12,因爲

一個int的sizeof是4

結構體的sizeof

終於到了重頭戲啦!雖然惡補兩天還是沒看懂,但是還是得貼出來呀!太重要太難了!
在這裏插入圖片描述
那麼,sizeof(S1)等於多少呢?

char佔1個字節,int佔4個字節,那麼加起來就應該是5,對嗎?

emmmm不對!不要灰心,我們好好琢磨下sizeof定義:對象或者數據類型佔的內存字節數。

觀察S1的內存,S1的地址爲0x0012FF78,其數據內容如下:

0012FF78:61 CC CC CC FF FF FF FF

爲什麼中間會插入3個CC呢?

這就是傳說中的字節對齊!

計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。爲此,編譯器默認會對結構體進行處理(實際上其它地方的數據變量也是如此),讓寬度爲2的基本數據類型(short等)都位於能被2整除的地址上,讓寬度爲4的基本數據類型(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充字節,所以整個結構體的sizeof值就增長了。

在上面的例子中,char佔1位字節,但是該結構體最寬的字節數是int,佔四個字節,所以寬度爲1的char需自動補全到4的倍數上,所以最後sizeof(S1)就爲8。

怎麼樣,這還是最基礎的結構體的sizeof呢!還有更復雜的結構體的sizeof需要我們去討論和研究,但是基於我還沒弄明白!所以接下來的學習任務就要我們一起去學習探討哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章