sizeof 與 strlen 的區別
阿新 • • 發佈:2018-11-15
由於在專案中,經常需要判別變數、陣列、字串等位元組長度,常常會用到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空字元