sizeof操作符詳解

2021-06-17 15:59:39 字數 2843 閱讀 3356

論及測試基礎是windows 32位平台,vs2008開發工具:

測試基本型別

1.基本規則

sizeof 操作符的作用是返回乙個物件或型別名所佔的記憶體位元組數,返回值的型別為size_t,長度的單位是位元組,在編譯而不是執行時確定。

• 對引用型別做sizeof操作將返回存放此引用型別物件所需的內在空間大小。

• 對指標做sizeof操作將返回存放指標所需的內在大小;注意,如果要獲取該指標所指向物件的大小,則必須對指標進行引用。

因為 sizeof 返回整個陣列在記憶體中的儲存長度,所以用 sizeof 陣列的結果除以sizeof 其元素型別的結果,即可求出陣列元素的個數:

例如:int ia[8];

int sz =sizeof(ia)/sizeof(*ia);

cout << sz<< endl; //8

2.sizeof與strlen的區別和聯絡? 

(2.1)sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別,該型別保證能容納實現所建立的最大物件的位元組大小。

(2.2)sizeof是操作符,strlen是函式。sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。

(2.3) 陣列名作為函式引數時,退化為指標,陣列名作為sizeof()引數時,陣列名不退化,因為sizeof不是函式。

(2.4)sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以」\0」結尾的。

(2.5)大部分編譯程式在編譯的時候就把sizeof計算過了,這就是sizeof(x)可以用來定義陣列維數的原因。strlen的結果要在執行的時候才能計算出來,是用來計算字串的實際長度,不是型別佔記憶體的大小。

(2.6)當作用於結構型別或變數,sizeof返回實際的大小,sizeof如用於陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小。

//對於靜態陣列的處理:

char str[11]="0123456789";//注意這裡str大小應該等於,應考慮』\0』在內,否則編譯器會報錯

cout << strlen(str) << endl;//10 strlen計算字串的長度,以結束符x00為字串結束。

cout << sizeof(str) << endl;//11 sizeof計算的則是分配的陣列str[11]所佔的記憶體空間的大小,不受裡面儲存的內容改變。

(2.7)陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址,如:

fun(char [8])

fun(char )

都等價於fun(char*)

void func( char str[100])  

void *p =malloc(100); 

cout << sizeof(p) << endl;

所以sizeof(str)和sizeof(p)都為4。

在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小,如果想在函式內知道陣列的大小,需要這樣做:進入函式後用memcpy拷貝出來,長度由令乙個形參傳進去。

void fun(unsigned char *p1,int len)

//對於指標的處理:

char *ss= "0123456789"; 

cout << sizeof(ss) << endl;//4 ss是指向字串常量的字元指標,sizeof獲得的是乙個指標所佔的空間,應該是長整型

cout << sizeof(*ss) << endl;//1 *ss是第乙個字元其實就是獲得了字串的第一位』』所佔的記憶體空間,是char型別的,佔了位

cout << strlen(ss) << endl;//10,如果要獲得這個字串的長度,則一定要使用strlen

//另外,下面的方法可以用於確定該靜態陣列可以容納元素的個數

int a[3]= ;  

cout  << sizeof a/sizeof(typeid(a[0]).name());//3

(2.8) sizeof()和初不初始化,沒有關係,strlen()和初始化有關。比較:

3.簡單結構體的sizeof

結構體每個變數分開占用空間。

位元組對齊的細節和編譯器實現相關,但一般而言,滿足三個準則:

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。

看記憶體情況:位元組對齊需要在中間補3個位元組的cc。

可以用pack指令用來調整結構體對齊方式的,#pragmapack的基本用法為:#pragmapack( n ),n為位元組對齊數,其取值為1、2、4、8、16。

「空結構體」(不含資料成員)的大小不是0,而是1。 「空結構體」變數也得被儲存。

4. union的sizeof

union 變數公用空間。

解析:裡面最大的變數型別是int[5], 占用20個位元組. 所以它的大小是20

詳解sizeof操作符

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

c c 操作符之sizeof

1 基本資料型別 常見的基本資料型別有void bool char int short int long int float double long long long double等。同型別有符號與無符號所佔位元組數相同,故在此不做區分。型別大小 void 0 byte bool 1 byte c...

操作符詳解

操作符的兩個運算元必須為整數 左移操作符 右移操作符左移操作符規則 右邊補0 右移操作符規則 1 邏輯移位 僅是移位操作符 左邊補0 2 算數移位 要考慮符號位 左邊補符號位 注意 對於一位運算子不要移動負數字,這是為標準定義的 按位與 按位或 按位異或位操作符的運算元必須是整數 賦值復合賦值符 例...