2013-08-05 75 views
0

時候有必要明確在C串的NULL字符提供空間。
對於例如;
這工作沒有任何錯誤,雖然我還沒有宣佈str是7個字符長,即對串加上NULL字符的字符。空間空字符

#include<stdio.h> 

int main(){ 
    char str[6] = "string"; 
    printf("%s", str); 
    return 0; 
} 

儘管在這個問題https://stackoverflow.com/a/7652089用戶說
這如果需要修改字符串後面,但知道它不會超過40個字符(或39個字符後跟一個空結束是非常有用的根據上下文)。

這是什麼意思」 根據上下文「?

+0

我猜在這種情況下,你的str是一個char數組,所以你可以用sizeof來表示例子的長度,但是如果你把str傳給一個函數,你會得到一個char *和sizeof將會給出一個其他的值 – Alexis

回答

3

當是有必要在C字符串NULL字符明確提供空間?

總是。沒有那個\0字符會使功能如strcpy,strlen和打印通過%s行爲錯誤。它可能適用於一些例子(比如你自己的例子),但我不會在這方面下注任何東西。

在另一方面,如果你的字符串是二進制的,你知道包的長度,你不需要額外的空間。但是,那麼你不能使用str*函數。無論如何,這不是你的問題。

1

它是越野車,關鍵字「緩衝區溢出」。內存被覆蓋。

char str[4] = "stringulation"; 
char str2[20]; 
printf("%s", str); 
printf("%s", str2); 
2

你的代碼調用未定義的行爲。您可能認爲它可行,但代碼已損壞。

要存儲C字符串與6個字符,和一個空終止,則需要長7個或更多的字符數組。

當是有必要明確地規定一個NULL字符空間,C字符串

沒有例外。 C字符串必須始終包含空終止字符。


什麼是 「根據上下文」 是什麼意思?

答案有畫,你打算在以後的時間來修改字符串變量,或者說你不會修改字符串變量之間的區別。在前一種情況下,您可能會選擇分配比初始內容更多的內容,因爲您希望能夠稍後添加更多內容。在後一種情況下,您可以簡單地分配初始值所需的字符數量,而不會再多。

2

試圖對你沒有要求可能會導致數據損壞,隨機輸出或代碼未定義性質的一些地址寫。

0

即0終止1 的各種庫函數(strcpy()strlen()printf()等)如何識別一個字符串的末尾。當您打電話等

char foo[6] = "hello"; 
printf("%s\n", foo); 

之前它傳遞給該函數數組表達foo轉換爲指針值的函數,因此,所有的功能接收是第一個字符的地址;它不知道foo陣列有多長。所以它需要一些方法來知道字符串的末尾在哪裏。如果foo沒有用於0終止符的空間,printf()將繼續在陣列末尾之外打印字符,直到它看到0值字節。


1.我更喜歡使用的術語「終止子0」而不是「NULL終止子」,只是爲了避免與NULL指針,這是一個不同的事情混淆。

+0

實際上,術語「NULL終止符」是不正確的,因爲根據定義,NULL是一個指針。 「\ 0」字符實際上被命名爲「null」,因此是「空字符」。我認爲「終止空字符」或「字符串終止空字符」表達最好。另外,在字符串上下文中,說「''0''終止符」會比說「0終止符」更精確 –