1. 程式人生 > >sizeof 與 strlen 的區別

sizeof 與 strlen 的區別

由於在專案中,經常需要判別變數、陣列、字串等位元組長度,常常會用到sizeof 和 strlen, 有時候經常會弄混,故整理一下。

 

1. sizeof :

sizeof 運算子 返回一條表示式或一個型別名字所佔的位元組數。與眾不同的一點是,sizeof 並不實際計算其執行物件的值。

Sales_data data , *p;
sizeof(Sales_data);//儲存Sales_data型別的物件所佔的空間大小
sizeof(data);//同上
sizeof(p);//指標所佔的空間大小,如果是64位系統,則為8
sizeof(*p);//p所指型別的空間大小,等價於 sizeof(Sales_data);sizeof(data)
sizeof(data.revenue);//Sales_data的revenue成員對應型別的大小

注意:由於 sizeof並不實際計算器執行物件的值,故對於sizeof(*p),即使p是一個無效的指標,也沒關係,在sizeof的運算物件中解引用一個無效指標仍然是一種安全的行為。

 

·對char或者型別為char的表示式執行sizeof運算,結果為1
·對引用型別執行sizeof運算得到被引用物件所佔空間的大小
·對指標執行sizeof運算得到指標本身所佔空間的大小//64位:8;32位:4
·對解引用指標執行sizeof運算得到指標指向的物件所佔空間的大小,指標不需有效
·對陣列執行sizeof運算得到整個陣列所佔空間的大小。注意:sizeof運算不會把陣列轉換成指標來處理
·對string物件或vector物件執行sizeof運算值返回該型別固定部分的大小,不會計算物件的元素佔用了多少空間
char *abc = "123";
char test[12]="123";
char test1[]="123";
cout<<sizeof(abc)<<endl;     //輸出8    64位,所以是8 ,指標長度
cout<<sizeof(test)<<endl;    //輸出12    陣列長度,12個位元組
cout << sizeof(test1)<<endl;  //輸出4   陣列長度,後面加上一個空字元,一共4個

 

2. strlen

這個函式是C語言下面的函式,所謂的C標準庫String 函式。作用:返回字串的長度,空字元不計算在內。

char ca[] = {'C','+','+'};
cout << strlen(ca) << endl;  // 錯誤     ca雖然是一個字元陣列,但它不是以空字元作為結束的,有可能沿著ca在記憶體中的位置不斷向前尋找,直到遇到空字元才停下來。

傳入strlen函式的指標必須指向以空字元作為結束的陣列;同類的函式有 strcmp, strcat, strcpy

char ca[] = {0x11,0x22,0x00,0x23};
cout<<strlen(ca)<<endl; // 輸出2,因為遇到 0x00空字元