首頁  >  文章  >  後端開發  >  C語言中sizeof和strlen的差別是什麼

C語言中sizeof和strlen的差別是什麼

王林
王林原創
2020-11-20 10:04:187808瀏覽

C語言中sizeof和strlen的差異是:strlen是一個函數,用來計算指定字串str的長度,但不包括結束字元(即null字元);而sizeof是一個單目運算符,不是函數。

C語言中sizeof和strlen的差別是什麼

區別分析:

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

size_t strlen(char const* str);

也正因為strlen 是一個函數,所以需要進行一次函數調用,呼叫範例如下面的程式碼所示:

char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", 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的长度=%d\n", sizeof(sArr));

相對於函數strlen,這裡的範例程式碼執行結果為7(因為它包括結束字元null)。同時,對 sizeof 而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩衝區的長度。也正是由於在編譯時計算,因此 sizeof 不能用來傳回動態分配的記憶體空間的大小。

相關推薦:C#.Net開發圖文教學

以上是C語言中sizeof和strlen的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn