[英]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.