C語(yǔ)言中sizeof 和 strlen的區(qū)別
sizeof
和 strlen
是兩個(gè)常用于 C/C++ 語(yǔ)言中的函數(shù)或操作符,它們?cè)诠δ芎褪褂脠?chǎng)景上有很大區(qū)別。
1. sizeof 操作符
- 功能:
sizeof
是一個(gè)編譯時(shí)操作符,用于計(jì)算數(shù)據(jù)類型或變量在內(nèi)存中占用的字節(jié)大小。它可以應(yīng)用于基本數(shù)據(jù)類型、數(shù)組、結(jié)構(gòu)體以及用戶定義的數(shù)據(jù)類型。 - 返回值:返回類型或?qū)ο笤趦?nèi)存中占用的總字節(jié)數(shù)。
- 作用對(duì)象:可以用于所有數(shù)據(jù)類型,包括基本類型、指針、數(shù)組、結(jié)構(gòu)體等。
- 計(jì)算范圍:計(jì)算整個(gè)數(shù)據(jù)結(jié)構(gòu)的大小,包括字符數(shù)組的末尾空字符
'\0'
,還會(huì)包括填充字節(jié)(對(duì)于結(jié)構(gòu)體而言)。 - 編譯期執(zhí)行:
sizeof
在編譯期執(zhí)行,因此不需要在運(yùn)行時(shí)計(jì)算其結(jié)果。
示例:
#include <stdio.h> int main() { int a = 10; char str[] = "Hello"; printf("Size of int: %lu\n", sizeof(a)); // 返回 4(假設(shè)int為4字節(jié)) printf("Size of char array: %lu\n", sizeof(str)); // 返回 6(包括'\0') return 0; }
輸出:
Size of int: 4
Size of char array: 6
sizeof(a)
計(jì)算int
類型變量a
所占的內(nèi)存,返回 4(假設(shè)int
類型在該系統(tǒng)中為 4 字節(jié))。sizeof(str)
返回char
數(shù)組str
的總大小,包括字符串末尾的\0
(即 6 字節(jié):Hello\0
)。
2. strlen 函數(shù)
- 功能:
strlen
是用于計(jì)算字符串長(zhǎng)度的標(biāo)準(zhǔn)庫(kù)函數(shù),它計(jì)算的是以'\0'
結(jié)尾的字符串中字符的數(shù)量。 - 返回值:返回字符串中的字符數(shù)(不包括末尾的空字符
'\0'
)。 - 作用對(duì)象:只能用于以
'\0'
結(jié)尾的 C 字符串,不能用于其他類型(如整數(shù)、結(jié)構(gòu)體、數(shù)組)。 - 運(yùn)行時(shí)執(zhí)行:
strlen
需要在運(yùn)行時(shí)遍歷字符串來(lái)計(jì)算其長(zhǎng)度,因此是運(yùn)行時(shí)計(jì)算的。
示例:
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello"; printf("Length of string: %lu\n", strlen(str)); // 返回 5 return 0; }
輸出:
Length of string: 5
strlen(str)
返回字符串 "Hello"
的長(zhǎng)度,不包括終止符 '\0'
,因此返回 5。
3. sizeof 與 strlen 的主要區(qū)別
特性 | sizeof | strlen |
---|---|---|
功能 | 計(jì)算數(shù)據(jù)類型或變量占用的總字節(jié)數(shù) | 計(jì)算字符串中字符的長(zhǎng)度,不包含 '\0' |
作用對(duì)象 | 可以作用于任何數(shù)據(jù)類型 | 僅限于以 '\0' 結(jié)尾的字符串 |
是否包含 \0 | 包含字符串的 '\0' (對(duì) char[] 而言) | 不包含 '\0' |
計(jì)算時(shí)機(jī) | 編譯時(shí)計(jì)算 | 運(yùn)行時(shí)計(jì)算 |
返回值 | 返回占用內(nèi)存的總字節(jié)數(shù) | 返回字符串中的字符數(shù),不包括末尾的 \0 |
適用范圍 | 基本類型、數(shù)組、結(jié)構(gòu)體、指針等 | 僅適用于 C 風(fēng)格的字符串 |
4. 對(duì)字符串的對(duì)比示例
假設(shè)我們有如下代碼:
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello"; printf("sizeof(str): %lu\n", sizeof(str)); // 6 (包含 '\0') printf("strlen(str): %lu\n", strlen(str)); // 5 (不包含 '\0') return 0; }
輸出:
sizeof(str): 6
strlen(str): 5
sizeof(str)
返回 6,因?yàn)?nbsp;str
是一個(gè)包含\0
的字符數(shù)組。strlen(str)
返回 5,因?yàn)樗挥?jì)算字符串"Hello"
中的字符數(shù),不包括末尾的空字符\0
。
5. 指針與數(shù)組的差異
當(dāng)我們使用指針時(shí),sizeof
的行為會(huì)有所不同。例如:
#include <stdio.h> #include <string.h> int main() { char *str = "Hello"; printf("sizeof(str): %lu\n", sizeof(str)); // 8 (假設(shè)指針是 8 字節(jié)) printf("strlen(str): %lu\n", strlen(str)); // 5 (計(jì)算指向的字符串長(zhǎng)度) return 0; }
輸出:
sizeof(str): 8
strlen(str): 5
sizeof(str)
返回 8,因?yàn)?nbsp;str
是一個(gè)指針,指針的大小在 64 位系統(tǒng)上通常是 8 字節(jié)。strlen(str)
返回 5,因?yàn)樗?jì)算的是指針指向的字符串"Hello"
的長(zhǎng)度。
總結(jié)
sizeof
用于計(jì)算數(shù)據(jù)類型或變量的總內(nèi)存大小,適用于任何類型(包括數(shù)組、指針等)。strlen
專門用于計(jì)算以'\0'
結(jié)尾的 C 字符串的長(zhǎng)度,只計(jì)算字符數(shù),不包括'\0'
。
到此這篇關(guān)于C語(yǔ)言中sizeof 和 strlen的區(qū)別的文章就介紹到這了,更多相關(guān)C語(yǔ)言 sizeof 和 strlen內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言sizeof和strlen區(qū)別小結(jié)
- C語(yǔ)言中sizeof和strlen的區(qū)別詳解
- C語(yǔ)言中的strlen()和sizeof()對(duì)比分析
- C語(yǔ)言之sizeof與strlen的使用及區(qū)別
- 淺談C語(yǔ)言中的sizeof()和strlen()的區(qū)別
- 關(guān)于C語(yǔ)言strlen與sizeof區(qū)別詳情
- C語(yǔ)言入門篇--sizeof與strlen基礎(chǔ)理論
- C語(yǔ)言中sizeof()與strlen()的區(qū)別詳解
- C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門及對(duì)比
- C語(yǔ)言中關(guān)于sizeof 和 strlen的區(qū)別分析
相關(guān)文章
Qt之簡(jiǎn)單的異步操作實(shí)現(xiàn)方法
這篇文章主要介紹了Qt之簡(jiǎn)單的異步操作實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11簡(jiǎn)單比較C語(yǔ)言中的execl()函數(shù)與execlp()函數(shù)
這篇文章主要介紹了C語(yǔ)言中的execl()函數(shù)與execlp()函數(shù)的簡(jiǎn)單比較,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法
今天小編就為大家分享一篇C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C++使用string的大數(shù)加法運(yùn)算(1)
這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)加法運(yùn)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09C++11中移動(dòng)構(gòu)造函數(shù)案例代碼
C++11 標(biāo)準(zhǔn)中為了滿足用戶使用左值初始化同類對(duì)象時(shí)也通過(guò)移動(dòng)構(gòu)造函數(shù)完成的需求,新引入了 std::move() 函數(shù),它可以將左值強(qiáng)制轉(zhuǎn)換成對(duì)應(yīng)的右值,由此便可以使用移動(dòng)構(gòu)造函數(shù),對(duì)C++11移動(dòng)構(gòu)造函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2023-01-01