日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

strlen 与 sizeof 的区别详解

發(fā)布時(shí)間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 strlen 与 sizeof 的区别详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫函數(shù)的時(shí)候,經(jīng)常要對數(shù)組和字符串以及指針進(jìn)行初始化。

  • strlen 是函數(shù),sizeof 是運(yùn)算符。
  • strlen 測量的是字符的實(shí)際長度。以’\0’ 結(jié)束。
  • 而sizeof 測量的是字符的分配大小。
  • 舉例:
  • eg1、char arr[10] = "What?";int len_one = strlen(arr);int len_two = sizeof(arr); cout << len_one << " and " << len_two << endl;

    輸出結(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)心空間的大小和類型。

    eg2、char * parr = new char[10];int len_one = strlen(parr);int len_two = sizeof(parr);int len_three = sizeof(*parr);cout << len_one << " and " << len_two << " and " << len_three << endl;
    • 輸出結(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ǔ)用的是長整型,所以為4);第三個(gè)結(jié)果,由于*parr所代表的是parr所指的地址空間存放的字符,所以長度為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: 20

    3.但是在子函數(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ù)組長度。

    #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í)際長度,它求得方法是從開始到遇到第一個(gè)’\0’,如果你只定義沒有給它賦初值,這個(gè)結(jié)果是不定的,它會(huì)從首地址一直找下去,直到遇到’\0’停止。而如果不在字符數(shù)組初始化的時(shí)候加上\0,那么strlen 得到的值就不是正確的數(shù)值,打印出來的結(jié)果也不是想要的結(jié)果。因此我們要避免這種情況,在初始化的時(shí)候要記得加上 \0,或者一次性賦初值。

    5.strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,是用來計(jì)算字符串的長度,不是類型占內(nèi)存的大小。而大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過了是類型或是變量的長度。

    6.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),且必須是以’’\0’'結(jié)尾的

    char str[20]="0123456789"; int a=strlen(str); //a=10; >>>> strlen 計(jì)算字符串的長度,以結(jié)束符 0x00 為字符串結(jié)束。 int b=sizeof(str); //而b=20; >>>> sizeof 計(jì)算的則是分配的數(shù)組 str[20] 所占的內(nèi)存空間的大小,不受里面存儲(chǔ)的內(nèi)容改變。

    上面是對靜態(tài)數(shù)組處理的結(jié)果,如果是對指針,結(jié)果就不一樣了

    char* ss = “0123456789”;
    sizeof(ss) 結(jié)果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個(gè)指針的之所占的空間,應(yīng)該是

    長整型的,所以是4
    sizeof(*ss) 結(jié)果 1 ===》*ss是第一個(gè)字符 其實(shí)就是獲得了字符串的第一位’0’ 所占的內(nèi)存空間,是char類

    型的,占了 1 位

    strlen(ss)= 10 >>>> 如果要獲得這個(gè)字符串的長度,則一定要使用 strlen

    總結(jié)

    以上是生活随笔為你收集整理的strlen 与 sizeof 的区别详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。