国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠(yuǎn)見教育科技集團(tuán)<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > 從一維數(shù)組看sizeof和strlen
從一維數(shù)組看sizeof和strlen
時(shí)間:2016-12-30作者:華清遠(yuǎn)見

前幾天學(xué)習(xí)一維數(shù)組的賦值的時(shí)候遇到這樣一個(gè)問題,程序如下:

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));
        運(yùn)行結(jié)果如下:
        6,5
        5,38
        6,5
        4,5

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

本質(zhì)上而言,sizeof是一個(gè)運(yùn)算符,它用類型作為參數(shù),而strlen只是C庫(kù)提供的一個(gè)函數(shù),他用來計(jì)算以’\0’結(jié)果的字符串的長(zhǎng)度,即它的參數(shù)只能是char*。它們相同的地點(diǎn)就只是返回值,都是一個(gè)size_t類型的值。

其實(shí)還有其他不同的地方,我們來通過這個(gè)程序分析下。

1)分析第一行第二行,同樣是給數(shù)組賦值了hello,為什么結(jié)果卻不一樣。
strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,是用來計(jì)算字符串的實(shí)際長(zhǎng)度,而sizeof的結(jié)果是在編譯的時(shí)候就計(jì)算過的,是類型或變量占內(nèi)存的大小。Strlen是計(jì)算以’\0’結(jié)束的字符串的長(zhǎng)度,故如果b的長(zhǎng)度就不是我們所想的我們給它賦值的字符串的長(zhǎng)度了。如果你對(duì)b進(jìn)行了如下的賦值:char b[5]={'h','e','l',‘\0’,'l'};那么b的長(zhǎng)度也只有3了。

2)sizeof是我們給字符串賦值時(shí)系統(tǒng)分配給數(shù)組所用空間的值。比較a和c,這個(gè)時(shí)候我們對(duì)它倆的賦值其實(shí)是一樣的,b區(qū)別于c,內(nèi)存給a、c分配的都是6個(gè)字節(jié),而b只分配給5個(gè)字節(jié)。

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

原因就是:數(shù)組作為參數(shù)傳給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址。sizeof(d) 結(jié)果 4 ,這個(gè)時(shí)候,d是指向字符串常量的字符指針,sizeof 獲得的是一個(gè)指針的之所占的空間,應(yīng)該是長(zhǎng)整型的,所以是4。而sizeof(a)中a表示的是分配的數(shù)組 a 所占的內(nèi)存空間的大小,不受里面存儲(chǔ)的內(nèi)容改變。

所以通常當(dāng)我們來計(jì)算字符串?dāng)?shù)組的長(zhǎng)度,到底用到的是 sizeof 和 strlen ,是需要考慮的,應(yīng)注意它們的區(qū)別。

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)