天天看點

sizeof 與 strlen的差別

1. sizeof的結果類型是size_t,在頭檔案中的typedef為unsigned int型, 表示0~MAX INT - 1

2. sizeof是運算符, strlen是函數

3. sizeof可以用類型和函數做參數,用函數做參數時,值為函數傳回值類型的大小。strlen隻能用char*做參數,且必須是“\0”結尾的

4. 數組做sizeof的參數不退化,做strlen的退化為指針

5. sizeof在編譯時确定,是類型或變量的長度,可以用來定義數組維數,是占用記憶體的大小。而strlen是運作時确定的,是字元串的長度。

6. sizeof後如果是類型必須加括号,如果是變量名不用加括号

7. 當使用一個結構類型或變量時,sizeof傳回實際大小,如struct。當使用一靜态空間數組時,sizeof傳回全部數組的尺寸,如char[100]。 sizeof不能傳回傳回被動态配置設定的數組或外部配置設定的數組尺寸

8. 數組作為參數傳給函數時傳遞的是指針而不是數組,傳遞的是數組的首位址,如fun(char[]),fun(char[10])都等價于fun(char *)

c++中傳遞數組永遠傳遞數組首位址的指針,編譯器不知道數組的大小。如果需要在函數内知道數組大小,需要在進入函數後用memcpy将數組複制出來,将長度用另一個形參傳進去

fun(unsigned char *p1, int len)

{

unsigned char* buf = new unsigned char[len + 1];

memcpy(buf, p1, len);

//函數原型

//void *memcpy(void*dest, const void *src, size_t n);

//功能

//由src指向位址為起始位址的連續n個位元組的資料複制到以destin指向位址為起始位址的空間内。

}

9. 計算結構變量或類的大小時要考慮資料對齊,C++把結構變量成員的大小按照4或者8的倍數計算,即資料對齊,data alignment。

加上#pragma pack(n)可取消對齊

10. sizeof操作符不能用于函數類型,不完全類型或位字段。不完全類型指具有位置存儲大小資料的資料類型,如未知存儲大小的數組類型,未知内容的結構體或聯合體,void類型

#include "stdafx.h"

#include "string.h"

class X

{

int i;

int j;

char k;

};

class Y{};

int _tmain(int argc, _TCHAR* argv[])

{

int **b1[3][3];

int c1 = sizeof(b1);//36  3*3 * 4

int *b2[3][3];

int c2 = sizeof(b2);// 36, 同b1

char* ss1 = "0123456789";

int c3 = sizeof(ss1);//4 ss1是指向字元串常量的指針

int c4 = sizeof(*ss1);//1 *ss1是第一個字元

char ss2[] = "0123456789";

int c5 = sizeof(ss2);//11, 字元串長度加結束字元\0

int c6 = sizeof(*ss2);//1 *ss2是第一個字元

int c13 = strlen(ss2);//10 數組長度

char ss3[100] = "0123456789";

int c7 = sizeof(ss3);//100 ss3表示在記憶體中配置設定的大小

int c8 = sizeof(*ss3);//1 *ss3是第一個字元

int c9 = strlen(ss3);//10 數組長度

int ss4[100] = { 1,2,3,4,5,6,7,8,9 };

int c10 = sizeof(ss4); // 400

//int c11 = strlen(ss4);//Error 1 error C2664: 'size_t strlen(const char *)' : cannot convert argument 1 from 'int [100]' to 'const char *' d:\users\administrator\documents\visual studio 2013\projects\6_3_6\6_3_6\6_3_6.cpp 31 1 6_3_6

X x;

int c11 = sizeof(X);//12 記憶體對齊

int c12 = sizeof(x);//12

int c14 = sizeof(Y);

//1  空類或空結構體的大小

//空類也要執行個體化,即在記憶體中配置設定一塊位址,每個執行個體在記憶體中都有獨一無二的位址

//這裡編譯器預設配置設定了一個位元組(char),用來标記可能初始化的類執行個體同時所占空間最少

//即使空類有構造函數和析構函數,它們跟sizeof也無關

//因為sizeof是針對執行個體的,普通的成員函數是針對類體的,一個類的成員函數也共用相同的函數指針,不能歸為執行個體的大小

//如果有虛函數,要維護虛函數表,則虛函數需要占用一個指針大小,4位元組

return 0;

}

繼續閱讀