strlen函數與sizeof的區別,C語言strlen與sizeof的區別詳解

2020-07-16 10:04:26
對於 strlen 和 sizeof,相信不少程式設計師會混淆其功能。雖然從表面上看它們都可以求字串的長度,但二者卻存在著許多不同之處及本質區別。

strlen 是一個函數,它用來計算指定字串 str 的長度,但不包括結束字元(即 null 字元)。其原型如下面的程式碼所示:

size_t strlen(char const* str);

也正因為 strlen 是一個函數,所以需要進行一次函數呼叫,呼叫範例如下面的程式碼所示:
char sArr[] = "ILOVEC";
/*用strlen()求長度*/
printf("sArr的長度=%dn", strlen(sArr));
很顯然,上面範例程式碼的執行結果為 6(因為不包括結束字元 null)。這裡需要特別注意的是,函數 strlen 返回的是一個型別為 size_t 的值,從而有可能讓程式導致意想不到的結果,如下面的範例程式碼所示:
/*判斷一*/
if(strlen(x)>= strlen(y))
{
}
/*判斷二*/
if(strlen(x)- strlen(y)>= 0)
{
}
從表面上看,上面的兩個判斷表示式完全相等,但實際情況並非如此。其中,判斷表示式一沒什麼問題,程式也能夠完全按照預想的那樣工作;但判斷表示式二的結果就不一樣了,它將永遠是真,這是為什麼呢?

原因很簡單,因為函數 strlen 的返回結果是 size_t 型別(即無符號整型),而 size_t 型別絕不可能是負的。因此,語句“if(strlen(x)-strlen(y)>=0)”將永遠為真。

同樣,就算表示式中同時包含了有符號整數和無符號整數,還是有可能產生意想不到的結果,如下面的程式碼所示:
/*判斷一*/
if(strlen(x)>= 5)
{
}
/*判斷二*/
if(strlen(x)- 5>=0)
{
}
很顯然,判斷表示式二的結果還是永遠是真,其原因與上面相同。

關鍵字 sizeof 是一個單目運算子,而不是一個函數。與函數 strlen 不同,它的引數可以是陣列、指標、型別、物件、函數等,如下面的範例程式碼所示:
char sArr[] = "ILOVEC";
/*用sizeof求長度*/
printf("sArr的長度=%dn", sizeof(sArr));
相對於函數 strlen,這裡的範例程式碼執行結果為 7(因為它包括結束字元 null)。同時,對 sizeof 而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩衝區的長度。也正是由於在編譯時計算,因此 sizeof 不能用來返回動態分配的記憶體空間的大小。