C语言中sizeof和strlen的区别是什么
C語言中sizeof和strlen的區(qū)別是:strlen是一個函數(shù),用來計算指定字符串str的長度,但不包括結(jié)束字符(即null字符);而sizeof是一個單目運算符,不是函數(shù)。
區(qū)別分析:
strlen 是一個函數(shù),它用來計算指定字符串 str 的長度,但不包括結(jié)束字符(即 null 字符)。其原型如下面的代碼所示:
size_t strlen(char const* str);
也正因為 strlen 是一個函數(shù),所以需要進行一次函數(shù)調(diào)用,調(diào)用示例如下面的代碼所示:
char sArr[] = "ILOVEC";
/*用strlen()求長度*/
printf("sArr的長度=%d\n", strlen(sArr));
很顯然,上面示例代碼的運行結(jié)果為 6(因為不包括結(jié)束字符 null)。這里需要特別注意的是,函數(shù) strlen 返回的是一個類型為 size_t 的值,從而有可能讓程序?qū)е乱庀氩坏降慕Y(jié)果,如下面的示例代碼所示:
/*判斷一*/
if(strlen(x)>= strlen(y))
{
}
/*判斷二*/
if(strlen(x)- strlen(y)>= 0)
{
}
從表面上看,上面的兩個判斷表達式完全相等,但實際情況并非如此。其中,判斷表達式一沒什么問題,程序也能夠完全按照預想的那樣工作;但判斷表達式二的結(jié)果就不一樣了,它將永遠是真,這是為什么呢?
原因很簡單,因為函數(shù) strlen 的返回結(jié)果是 size_t 類型(即無符號整型),而 size_t 類型絕不可能是負的。因此,語句“if(strlen(x)-strlen(y)>=0)”將永遠為真。
同樣,就算表達式中同時包含了有符號整數(shù)和無符號整數(shù),還是有可能產(chǎn)生意想不到的結(jié)果,如下面的代碼所示:
/*判斷一*/
if(strlen(x)>= 5)
{
}
/*判斷二*/
if(strlen(x)- 5>=0)
{
}
很顯然,判斷表達式二的結(jié)果還是永遠是真,其原因與上面相同。
關(guān)鍵字 sizeof 是一個單目運算符,而不是一個函數(shù)。與函數(shù) strlen 不同,它的參數(shù)可以是數(shù)組、指針、類型、對象、函數(shù)等,如下面的示例代碼所示:
char sArr[] = "ILOVEC";
/*用sizeof求長度*/
printf("sArr的長度=%d\n", sizeof(sArr));
相對于函數(shù) strlen,這里的示例代碼運行結(jié)果為 7(因為它包括結(jié)束字符 null)。同時,對 sizeof 而言,因為緩沖區(qū)已經(jīng)用已知字符串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩沖區(qū)的長度。也正是由于在編譯時計算,因此 sizeof 不能用來返回動態(tài)分配的內(nèi)存空間的大小。
聲明:
本文于網(wǎng)絡整理,版權(quán)歸原作者所有,如來源信息有誤或侵犯權(quán)益,請聯(lián)系我們刪除或授權(quán)事宜。
總結(jié)
以上是生活随笔為你收集整理的C语言中sizeof和strlen的区别是什么的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快看 app
- 下一篇: 牛奶的营养成分含量表 牛奶的营养成分和含