簡體   English   中英

puts()如何在沒有\\ 0終止符的情況下找到數組的結尾?

[英]How can puts() find the end of an array without a \0 terminator?

在此代碼中:

int length = atoi(argv[1]);
char *tab = malloc(length * sizeof(char));
memset(tab, '-', length);
puts(tab);

無論我將什么值傳遞給argv[1] ,輸出都是正確的。 例如,對於argv[1] = "5"我得到----- (五個連字符)。

我想知道當我沒有在char數組的末尾放置'\\ 0'時, puts()如何找到輸入字符串的末尾。

@aschepler說什么。 我猜想,是某種操作系統(您的C運行時或啟動代碼)正在對內存進行調零,然后再對其進行malloc 結果,由於您沒有覆蓋已經存在的\\0字節,因此您的字符串以null終止。 不要以為這將永遠有效!

編輯不同的編譯器,操作系統和庫以不同的方式初始化內存。 這個問題及其答案,以及同樣的問題 ,提供了一些初始化模式的示例,以及其他寫入內存以幫助調試的模式。 事實證明,至少有一個編譯器(IBM XLC) 使您可以選擇未初始化的自動值。

嘗試值0、1、1000、1000000、1000000000、1000000000000,-1。

一個人從商店偷了一些東西卻沒有被發現,這使偷竊行嗎? 嘗試偷整個商店,看看它是否“有效”。

puts()需要一個字符串 ,這意味着一個空字符肯定會結束它-否則它不是字符串 如果代碼違反了規則,則puts()不必以某種方式運行。 這是未定義的行為 (UB)。


順便說一句,代碼還應該在memset(tab, '-', length);使用tab != NULL之前檢查它是否tab != NULL memset(tab, '-', length);

如上面的@cxw所述,您很幸運(或者您的系統在malloc上只是將您的內存\\0 )您的字符串在其內容后保持\\0

我還想補充一點,但是您不應該依賴這種方法,因為它會使您的程序不穩定並且容易崩潰。 在這種情況下,您最終將獲得無效的讀取錯誤,但是如果您的malloc變大了,您將在讀取未初始化的內存。

您可能需要使用Valgrind等工具來發現內存問題。 始終牢記,在發布程序之前,應修復所有內存錯誤,因為崩潰很可能取決於在其上執行程序的平台,而且還可能會惡意使用此類錯誤。

暫無
暫無

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

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