strlen 与 sizeof 的区别详解
寫函數(shù)的時(shí)候,經(jīng)常要對(duì)數(shù)組和字符串以及指針進(jìn)行初始化。
輸出結(jié)果為:5 and 10
點(diǎn)評(píng):sizeof返回定義arr數(shù)組時(shí),編譯器為其分配的數(shù)組空間大小,不關(guān)心里面存了多少數(shù)據(jù)。strlen只關(guān)心存儲(chǔ)的數(shù)據(jù)內(nèi)容,不關(guān)心空間的大小和類型。
- 輸出結(jié)果:23 and 4 and 1
點(diǎn)評(píng):第一個(gè)輸出結(jié)果23實(shí)際上每次運(yùn)行可能不一樣,這取決于parr里面存了什么(從parr[0]開始知道遇到第一個(gè)NULL結(jié)束);第二個(gè)結(jié)果實(shí)際上本意是想計(jì)算parr所指向的動(dòng)態(tài)內(nèi)存空間的大小,但是事與愿違,sizeof認(rèn)為parr是個(gè)字符指針,因此返回的是該指針?biāo)嫉目臻g(指針的存儲(chǔ)用的是長(zhǎng)整型,所以為4);第三個(gè)結(jié)果,由于*parr所代表的是parr所指的地址空間存放的字符,所以長(zhǎng)度為1。
比如:
char str[20] = "hello";printf("strlen: %d\n", strlen(str)); printf("sizeof: %d\n", sizeof(str));結(jié)果顯示為:
[root@localhost 0703]# ./hello strlen: 5 sizeof: 203.但是在子函數(shù)中,ziseof 會(huì)把從主函數(shù)中傳進(jìn)來的字符數(shù)組當(dāng)作是指針來處理。指針的大小又是由機(jī)器來決定,而不是人為的來決定的。
#include <stdio.h>void size_of(char str[]) {printf("sizeof:%d\n", sizeof(str)); }int main() {char str[20] = "hello";size_of(str);return 0; }結(jié)果顯示為sizeof:4
4.我們知道字符數(shù)組的初始化一次性賦值,也可以逐個(gè)賦值。可以指定數(shù)組的大小,也可以不指定數(shù)組長(zhǎng)度。
#include <stdio.h> #include <string.h>int main() {char str1[] = "hello";char str2[] = {'h', 'e', 'l', 'l', 'o', '\0'};char str3[] = {'h', 'e', 'l', 'l', 'o'};printf("str1:%s\n",str1);printf("str2:%s\n",str2);printf("str3:%s\n",str3);printf("str1:%d\n", strlen(str1));printf("str2:%d\n", strlen(str2));printf("str3:%d\n", strlen(str3));return 0; }結(jié)果顯示為:
str1:hello str2:hello str3:hellohello str1:5 str2:5 str3:10這是為什么呢?
我們知道字符串是以 ‘\0’ 為結(jié)束標(biāo)志的,所以char str1[ ] = “hello” 等效于char str2[ ] = {‘h’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ , ‘\0’} 。strlen函數(shù)求的是字符串的實(shí)際長(zhǎng)度,它求得方法是從開始到遇到第一個(gè)’\0’,如果你只定義沒有給它賦初值,這個(gè)結(jié)果是不定的,它會(huì)從首地址一直找下去,直到遇到’\0’停止。而如果不在字符數(shù)組初始化的時(shí)候加上\0,那么strlen 得到的值就不是正確的數(shù)值,打印出來的結(jié)果也不是想要的結(jié)果。因此我們要避免這種情況,在初始化的時(shí)候要記得加上 \0,或者一次性賦初值。
5.strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,是用來計(jì)算字符串的長(zhǎng)度,不是類型占內(nèi)存的大小。而大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過了是類型或是變量的長(zhǎng)度。
6.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),且必須是以’’\0’'結(jié)尾的
char str[20]="0123456789"; int a=strlen(str); //a=10; >>>> strlen 計(jì)算字符串的長(zhǎng)度,以結(jié)束符 0x00 為字符串結(jié)束。 int b=sizeof(str); //而b=20; >>>> sizeof 計(jì)算的則是分配的數(shù)組 str[20] 所占的內(nèi)存空間的大小,不受里面存儲(chǔ)的內(nèi)容改變。上面是對(duì)靜態(tài)數(shù)組處理的結(jié)果,如果是對(duì)指針,結(jié)果就不一樣了
char* ss = “0123456789”;
sizeof(ss) 結(jié)果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個(gè)指針的之所占的空間,應(yīng)該是
長(zhǎng)整型的,所以是4
sizeof(*ss) 結(jié)果 1 ===》*ss是第一個(gè)字符 其實(shí)就是獲得了字符串的第一位’0’ 所占的內(nèi)存空間,是char類
型的,占了 1 位
strlen(ss)= 10 >>>> 如果要獲得這個(gè)字符串的長(zhǎng)度,則一定要使用 strlen
總結(jié)
以上是生活随笔為你收集整理的strlen 与 sizeof 的区别详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB的pid和vid以及usb路径名字
- 下一篇: 关于程序中的操作符左移和右移问题