2014-06-19 50 views
0

strlen()被null終止?那麼當strlen(c)和strlen()是什麼時候,char c [] = {'1','1'}和char d [] = {'1','1','\ 0'}如何得到相同的輸出2? (d)被使用?strlen如何爲{'1','1'}和{'1','1',' 0'}給出相同的輸出?

+1

'\ 0'是字符串終止的符號不爲空 –

+2

可能在'c'數組中的第二個元素後面恰好有一個0。 –

+2

@AlexandruCimpanu ** C99標準**調用字符串「null-terminated」(例如p303)。 OP指的是空字符,而你可能正在考慮空指針或NULL(它不能保證是指針)。 –

回答

5

前者是未定義的行爲;它可以輸出2,也可以輸出500,終止你的程序或破壞你的電腦。

0

這只是你得到運氣。

strlen()函數將開始計數直到它找到'\ 0'。

在您的d字符串中,將'\ 0'放在字符串的末尾。 strlen func然後返回2個字符。

在你的第二個函數裏,在你的記憶裏你有很多'\ 0',並且你的c字符串結尾的字符是'\ 0'。所以,它返回相同的值;)

+5

如果因爲未定義的行爲而發生作用,我會稱之爲*糟糕的運氣。 – user694733

1

strlen(d)將返回2,沒有問題。

strlen(c)將返回> = 2 如果字符在位置c + 2 ==「\ 0」,那麼你是幸運的,strlen(c)回報2,但你不能有任何的保障!

0

\ 0標記字符串的終止字符不爲NULL。 strlen在給出一個字符串時不計算終止字符,它會計數直到找到\ 0,然後停止並返回。

同樣在寫作時

char a [] =「hello」;

這將分配6個內存空間5用於hello和1用於\ 0。 在大多數情況下strlen(c)不會是2

+1

除了你以外,沒有人在討論'NULL'。 –

1

strlen()被null終止?

我認爲使用錯誤的術語會產生一些混淆:「strlen」是C標準函數的名稱;函數不是「由null終止」。如果你的意思是strlen應該用於以空字符結尾的字符序列,那麼「null-terminated」意味着'\ 0'是決定序列結束的最終哨兵字符,那麼是的:strlen會這樣做。

請注意,NULL(全部大寫)通常定義爲0(在stddef.h中)的別名。

然而,上面所說的,在你的例子中,字符'c'和'd'的兩個數組有不同的內容。前者包含兩項,後三項。 strlen的有效輸入只是你的'd'數組。你的數組'c'不是以null結尾的。

strlen返回正確的長度的原因無論如何是'c'被分配的區域包含,純粹的機會,在數組的最後一個項目後的'\ 0'。

相關問題