談一談sizeof與strlen

2021-07-05 10:34:47 字數 1108 閱讀 2235

sizeof與strlen都可以用來測量字元陣列的大小,通過乙個列子來看它們的不同

例:char *ss1 = "abcdefg";

char ss2 = "abcdefg";

char ss3[10] = "abcdefg";

cout << sizeof(ss1) 87107

分析:sizeof衡量的是字元陣列的真是占用的空間,包含預分配空間,而且對於指標變數sizeof並不測定該指標所指向空間占用的記憶體大小,而僅是返回該指標變數所佔的記憶體(所有的指標均占有4個位元組),sizeof在衡量字元陣列大小時,是衡量字串的真實大小,包含了最後的結尾符「\0」,所以sizeof(ss2)會是8;對於strlen衡量的是字串的實際字元個數,不包含結尾符,其實strlen測定的字元陣列是以「\0」作為計算結束標誌的,所以對於預分配空間,是不會計算在內的,而且strlen只能測定已「\0」結尾的字串,對於整數陣列則不能測定。

sizeof的一些性質:

(1)sizeof不是函式,是一種運算子,括號中的內容在編譯的過程中是不被編譯的,而是被替代為型別,如int a=5;sizeof(a)在編譯是被替換為sizeof(int)所以得到4,sizeof(a=6)這樣也是得到相同的結果,因為括號中的內容不被編譯,所以a的值仍是5,即括號中的式子是不會被執行,在測定具有返回值的函式也是一樣,函式本身並不會被執行,僅是用函式的返回值進行替換。

(2)當使用乙個結構型別或變數時,sizeof返回實際的大小,當使用一靜態的空間陣列時,sizeof返回全部的陣列大小,sizeof操作符不能返回被動態分配的陣列或外部的陣列大小(如類中的static變數,則sizeof測定是不計入在內)。

(3)如果想用sizeof測定乙個傳入函式中的陣列大小,是不可能的,因為傳入的不是陣列而是指標,如fun(char [8]),fun(char )都等價於fun(char *)這時用sizeof測定大小都是4,即指標所在記憶體。對字串使用strlen是可以測定字串的大小的。

(4)在計算結構體變數的大小時,就必須考慮資料對其的問題,這個問題在前面的部落格中有介紹,這裡就不在重複。

(5)sizeof後面如果是型別必須加括號,如果是變數名可以不加括號,因為sizeof是運算子而不是函式,例int a; sizeof a也可以是sizeof(a)都是准許的。

談一談教育

今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...

談一談裁員

資本寒冬,經濟不景氣,要保持公司運作,可能會涉及到裁員。另外,有些員工的價值觀已經與公司不符,再留用可能會影響團隊和公司的和諧,此時也可能會涉及到裁員。裁員,不是說想裁就能裁的,需要考慮幾個方面 為什麼要裁?是否可以不裁?裁員是否會影響業務程序?裁員是否會付出經濟代價 賠償 裁員是否會負一定的法律責...

C 談一談this指標

當你進入乙個 房子 後,你可以看見桌子 椅子 地板等,但是房子你是看不到全貌了。對於乙個類的例項來說,你可以看到它的 成員函式 成員變數 但是例項本身呢?this是乙個 指標 它時時刻刻指向你這個 例項 本身class date void printdate 結果如下 進過反彙編,我們知道了 ecx...