2014-10-02 73 views
0
#include <stdio.h> 

int main(void) { 
    char arr[10]; 
    gets(arr);//let's suppose input is "abcdefgshsdfhdsfsh" 
    printf("%s",arr);//output come is same as input but the allocated arr have 10 bytes memory 
         //and can store only ten characters but how come it's possible i am getting output 
         //more than 10 character 
    return 0; 
} 

輸出背後的原因是什麼?任何幫助,將不勝感激。任何人都可以解釋爲什麼輸出超過了內存分配?

+2

字符串最後需要'\ 0'。你在這裏展示的是未定義的行爲。 – 101010 2014-10-02 06:09:46

+0

@ 40two:'gets()'終止於用'\ 0''讀取的數據。 – alk 2014-10-02 06:19:48

+2

在沒有解釋**的情況下關閉與UB的這種引用爲什麼**這是UB沒有意義。 – alk 2014-10-02 06:21:52

回答

-3

C字符串(類型爲char的數組)需要終止空字節來指示字符串的結尾。當一個字符串的字節正在被例如printf(),當空達到時,函數將停止處理這些字節。由於您超出了數組的長度(並且在任何與數組相鄰的內存中,末尾的空字節已放置在遠離數組起點的10個字節之外),因此函數將在未定義的字節數打印。

+0

Downvoter:小心解釋爲什麼? – 2014-10-02 06:20:04

+1

它不是缺少的'0'終結符,它使得代碼失敗,因爲'gets()'確實需要添加它,但緩衝區溢出,由用戶通過輸入超過9個字符引發。 Btw:'NULL'與'0'又名'NUL'又名'null'又名''\ 0''。 – alk 2014-10-02 06:38:01

+0

在C/C++語言的規範中,空指針可能與0不同(或更確切地說來自'(void *)0')。然而,對於空字節,它總是等於'(char)0'或''\ 0'',而不能是其他任何東西。 – SylvainL 2014-10-02 06:46:54

0

未定義的行爲意味着程序沒有遵循該語言的規則,並且編譯器對結果行爲沒有任何承諾。

所以當你寫過一個未定義行爲的數組的末尾時,語言不會承諾它會讓你知道錯誤。它可能似乎工作,它可能會崩潰。今天和明天可能會做一件事。

這就好比把50磅的東西放在額定容量爲20磅的架子上。也許它會撐起來,也許它會立即崩潰。也許它會持續下去,直到你拿走東西,而這一切都會崩潰。

+1

未定義行爲的貨架類比值得+1!然而,他沒有向OP_how_解釋,他已經寫了數組的末尾('gets()'的不安全行爲)取消了這一點(爲了公正地檢查器-g和他的答案)。 – AAT 2014-10-13 14:12:17

2

因爲get從stdin獲取字節並將它們放在某處時不做任何類型的檢查。一個簡單的例子:

char array1[] = "12345"; 
char array2[] = "67890"; 

gets(array1); 

現在,首先你被允許輸入你想有多少個字符,gets不會在意它。其次,超過你放置它們的數組大小的字節(在本例中爲array1)將覆蓋它們在內存中找到的任何內容,因爲gets將寫入它們。在前面的例子中,這意味着如果輸入「abcdefghijklmnopqrts」可能會不可預知,它也會覆蓋array2或其他什麼。

該函數是不安全的,因爲它假定輸入一致。永遠不要使用它!

更安全的方法是fgets()

所以,你要避免getsfgets將永遠讀取新行,如果緩衝區足夠大,以容納它(它可以讓你知道什麼時候緩衝區太小,有更多的線路等待讀取)。如果您想要fgets之類的東西不會讀取新行(丟失指示過小的緩衝區),則可以使用fscanf,其掃描集轉換爲:「%N [^ \ n]」,其中strtok(buffer, "\n");這不是如何strtok意圖是:1.

一個簡單的(如果怪)方式與fgets讀取後除去從緩衝器後新線是 - 「N」是由緩衝器大小替換使用,但我已經比預期的方式更頻繁地使用它(我通常避免這種方式)。

來源:從我保存的問題中複製而來。

+0

部分來源的鏈接; http://stackoverflow.com/a/3302308/3747990 – Niall 2014-10-02 07:05:16

相關問題