簡體   English   中英

C字符串中Null字符的空間

[英]Space for Null character in c strings

什么時候需要為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個字符,后跟一個空終止符,取決於上下文),這將很有用。

取決於上下文 ”是什么意思?

什么時候需要為C字符串中的NULL字符顯式提供空間?

總是 如果沒有\\0字符,則會使諸如strcpystrlen和通過%s打印%s功能出現錯誤。 它可能適用於某些示例(例如您自己的示例),但我不會對此打賭。

另一方面,如果您的字符串是二進制的,並且您知道數據包的長度,則不需要額外的空間。 但是,那么您將無法使用str*函數。 無論如何,這不是您的問題。

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

要存儲包含6個字符和一個空終止符的C字符串,您需要一個長度為7或更大的字符數組。

什么時候需要為C字符串中的NULL字符顯式提供空間

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


“取決於上下文”是什么意思?

答案是要區分您打算在以后修改的字符串變量和您不會修改的字符串變量。 在前一種情況下,您可能會選擇分配超出初始內容所需的空間,因為您希望以后可以添加更多內容。 在后一種情況下,您只需為初始值分配所需的字符數即可,而不再分配更多的字符。

嘗試在您未請求的地址上書寫可能會導致數據損壞,隨機輸出或代碼的不確定性質。

它是越野車,關鍵字“緩沖區溢出”。 內存被覆蓋。

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

0終止符1是各種庫函數( strcpy()strlen()printf()等)如何標識字符串的結尾。 當您調用類似

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

數組表達式foo在傳遞給函數之前已轉換為指針值,因此該函數接收的所有內容均為第一個字符的地址; 它不知道foo數組多長時間。 因此,需要某種方式來知道字符串的結尾在哪里。 如果foo沒有用於0終止符的空間,則printf()將繼續在數組末尾輸出字符,直到看到0值字節為止。


1.我更喜歡使用術語“ 0終止符”而不是“ NULL終止符”,只是為了避免與NULL指針混淆,這是另一回事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM