久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 從一維數組看sizeof和strlen
從一維數組看sizeof和strlen
時間:2016-12-30作者:華(hua)清(qing)遠見

前幾天學習一維數組的賦值的時(shi)候遇到這樣一個問題,程序(xu)如下:

char a[]="hello";
        char b[5]={'h','e','l','l','o'};
        char c[]={'h','e','l','l','o','\0'};
        char *d="hello";
        printf("%d,%d\n",sizeof(a),strlen(a));
        printf("%d,%d\n",sizeof(b),strlen(b));
        printf("%d,%d\n",sizeof(c),strlen(c));
        printf("%d,%d\n",sizeof(d),strlen(d));
        運行結果如下:
        6,5
        5,38
        6,5
        4,5

在分析結果之前,我們先來看下sizeof和(he)strlen的區別。

本(ben)質(zhi)上而言,sizeof是一個(ge)運算符(fu),它用類型作為參數(shu),而strlen只(zhi)(zhi)是C庫提供的(de)一個(ge)函數(shu),他用來計(ji)算以’\0’結(jie)果的(de)字(zi)符(fu)串的(de)長度,即(ji)它的(de)參數(shu)只(zhi)(zhi)能是char*。它們相同(tong)的(de)地(di)點就(jiu)只(zhi)(zhi)是返回值,都是一個(ge)size_t類型的(de)值。

其實還有其他(ta)不同的(de)地(di)方,我們來通過這個程序分析下。

1)分析第一行第二行,同樣是給數組賦值了hello,為什么結果卻不一樣。
strlen的(de)(de)(de)(de)結果要在運行(xing)的(de)(de)(de)(de)時候才能計算(suan)出來,是用(yong)來計算(suan)字符(fu)串的(de)(de)(de)(de)實(shi)際(ji)長(chang)度(du),而sizeof的(de)(de)(de)(de)結果是在編譯(yi)的(de)(de)(de)(de)時候就計算(suan)過的(de)(de)(de)(de),是類型(xing)或變量占內(nei)存(cun)的(de)(de)(de)(de)大小。Strlen是計算(suan)以(yi)’\0’結束(shu)的(de)(de)(de)(de)字符(fu)串的(de)(de)(de)(de)長(chang)度(du),故如果b的(de)(de)(de)(de)長(chang)度(du)就不是我們(men)所想的(de)(de)(de)(de)我們(men)給它(ta)賦(fu)值(zhi)的(de)(de)(de)(de)字符(fu)串的(de)(de)(de)(de)長(chang)度(du)了。如果你對b進行(xing)了如下的(de)(de)(de)(de)賦(fu)值(zhi):char b[5]={'h','e','l',‘\0’,'l'};那么b的(de)(de)(de)(de)長(chang)度(du)也只有3了。

2)sizeof是(shi)我(wo)們給字(zi)符串賦(fu)值(zhi)時(shi)系統(tong)分(fen)配給數組(zu)所用空間(jian)的(de)(de)值(zhi)。比較a和c,這個時(shi)候(hou)我(wo)們對它倆的(de)(de)賦(fu)值(zhi)其(qi)實(shi)是(shi)一樣的(de)(de),b區別于c,內存(cun)給a、c分(fen)配的(de)(de)都(dou)是(shi)6個字(zi)節(jie),而b只分(fen)配給5個字(zi)節(jie)。

3)分析第(di)一行第(di)四行,為什么同樣給a、d賦值了(le)一個字(zi)符串,用strlen求出(chu)的(de)值相同而用sizeof求出(chu)的(de)不一樣?

原因就是(shi)(shi)(shi):數(shu)(shu)組(zu)作為(wei)參數(shu)(shu)傳(chuan)給(gei)函數(shu)(shu)時傳(chuan)的(de)(de)(de)(de)(de)是(shi)(shi)(shi)指(zhi)針而不是(shi)(shi)(shi)數(shu)(shu)組(zu),傳(chuan)遞的(de)(de)(de)(de)(de)是(shi)(shi)(shi)數(shu)(shu)組(zu)的(de)(de)(de)(de)(de)首地址。sizeof(d) 結果 4 ,這個(ge)(ge)時候,d是(shi)(shi)(shi)指(zhi)向字(zi)符串常量的(de)(de)(de)(de)(de)字(zi)符指(zhi)針,sizeof 獲得的(de)(de)(de)(de)(de)是(shi)(shi)(shi)一個(ge)(ge)指(zhi)針的(de)(de)(de)(de)(de)之(zhi)所占(zhan)的(de)(de)(de)(de)(de)空間(jian),應(ying)該是(shi)(shi)(shi)長整(zheng)型的(de)(de)(de)(de)(de),所以(yi)是(shi)(shi)(shi)4。而sizeof(a)中a表示(shi)的(de)(de)(de)(de)(de)是(shi)(shi)(shi)分配的(de)(de)(de)(de)(de)數(shu)(shu)組(zu) a 所占(zhan)的(de)(de)(de)(de)(de)內存(cun)空間(jian)的(de)(de)(de)(de)(de)大(da)小,不受里(li)面存(cun)儲的(de)(de)(de)(de)(de)內容改變。

所以通常當我們來計算(suan)字符串數組的(de)(de)長度,到(dao)底用到(dao)的(de)(de)是(shi) sizeof 和 strlen ,是(shi)需要考慮的(de)(de),應注意它們的(de)(de)區別。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)