C語言中sizeof 的用法

2021-09-04 02:05:38 字數 3065 閱讀 8228

只要參加軟體研發的筆試(c/c++)幾乎都會涉及到sizeof()的用法,我昨天也遇到了,有的也會,但是真正sizeof()的核心還是沒有領會,今天上網,無聊中就看到了詳細的sizeof()的闡述,現在分享給大家。

------------sizeof----------------

sizeof 一般形式為:sizeof(object),也可以sizeof var_char,不過大部分programer習慣用sizeof()。

物件可以是表示式或者資料型別名,當物件是表示式時,括號可省略。sizeof是單目運算子,其運算子的含義是:求出物件在計算機記憶體中所占用的位元組數。一般來講,不同的機器,執行不同的物件是不一樣的,當目前幾乎所有的機器都是32位,很少16位的,所以一般考試都是基於32位的window和linux的。

c語言中資料型別不多。

1.整數型的:

short,int,long(我沒有考慮符號問題),一般c語言書上講,int是2個位元組的,即16位,範圍是-32768-32767,long是4個位元組,範圍是-2^32---2^32-1。當時在xp上執行sizeof(int)的時候,會output 4.這就是32位的原因。sizeof(long)也是4.

如下:#include "stdio.h"

因而int,short的sizeof結果是一樣的額。

2.浮點型資料

float,double,long double

上邊的圖,long double 沒有測試(忘了。。。。。)呵呵!

但是應該是16。

3。指標

對於指標,要特別區分,指標指向什麼資料,它在記憶體佔的位元組數才是它的結果。

比如:指標指向乙個字串,就是字串的長度,因為乙個字元在記憶體中佔乙個位元組。若指標指向乙個資料結構,則結果應該是結構型資料的記憶體位元組數。

4。結構型別

在上面的程式中,

struct strstr_wu;

struct str1str_wu1;

兩個不同的結構,但是內部的元素是相同的,都是double,int,char,只是順序不一樣,就結果不一樣。why?

這時因為vc儲存資料的時候要對其,具體的情況如下: 型別

對齊方式(變數存放的起始位址相對於結構的起始位址的偏移量)

char

偏移量必須為sizeof(char)即1的倍數

int 

偏移量必須為sizeof(int)即4的倍數

float

偏移量必須為sizeof(float)即4的倍數

double

偏移量必須為sizeof(double)即8的倍數

short

偏移量必須為sizeof(short)即2的倍數

比如:str_wu,為上面的結構分配空間的時候,vc根據成員變數出現的順序和對齊方式,先為第乙個成員dda1分配空間,其起始位址跟結構的起始位址相同(剛好偏移量0剛好為sizeof(double)的倍數),該成員變數占用sizeof(double)=8個位元組;接下來為第二個成員dda分配空間,這時下乙個可以分配的位址對於結構的起始位址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變數占用sizeof(char)=1個位元組;接下來為第三個成員type分配空間,這時下乙個可以分配的位址對於結構的起始位址的偏移量為9,不是sizeof(int)=4的倍數,為了滿足對齊方式對偏移量的約束問題,vc自動填充3個位元組(這三個位元組沒有放什麼東西),這時下乙個可以分配的位址對於結構的起始位址的偏移量為12,剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變數占用sizeof(int)=4個位元組;這時整個結構的成員變數已經都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結構的位元組邊界數(即結構中占用最大空間的型別所占用的位元組數sizeof(double)=8)的倍數,所以沒有空缺的位元組需要填充。所以整個結構的大小為:sizeof(str_wu)=8+1+3+4=16,其中有3個位元組是vc自動填充的,沒有放任何有意義的東西。

而str_wu1,同樣的道理:如下:sizeof(char)=1,而1不是8的倍數,因而增加到8,sizeof(double)=8,現在開始位址是16,16是sizeof(int)的倍數,可以存入。

因而總的位址數:sizeof(char)+7+sizeof(double)+sizeof(int)=20,

而20不是8的倍數(sizeof(double)=8),所以需要在增加4個位址,即總共24。

----------------------

sizeof具體的,我所知道的就這些了,那位高手還知道什麼,或者我寫的有什麼錯,希望指出。謝謝!

附件:from: 

C語言中的sizeof用法

c語言中的sizeof是乙個很有意思的關鍵字,經常有人用不對,搞不清不是什麼。我以前也有用錯的時候,現在寫一寫,也算是提醒一下自己吧。反正現在來看,還在搞sizeof是什麼意思,怎麼用正確,還是有點搞笑,都經常用的東西,沒有理解透徹,就差的太遠了。第一 sizeof是什麼 sizeof是c語言的一種...

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...