2014-01-21 32 views
1

我已經用C編寫了一個簡單的程序。一個程序輸入一個字符串並將其與長度一起顯示。字符數組是C動態的嗎?

#include<stdio.h> 

int main() 
{ 
char a[4]; 
printf("Enter the name : "); 
gets(a); 

printf("\nThe name enterd is : %s",a); 
printf("\nLength of string is : %d",strlen(a)); 

getch(); 
return 0; 
} 

該程序不包含警告或錯誤。

在運行時,我輸入值「melwinsunny」作爲輸入。沒有錯誤,結果顯示如下:

Enter the name : melwinsunny 

The name entered is : melwinsunny 

length of string is : 11 

爲什麼會這樣?我已經聲明瞭長度爲4的字符數組(char a [4])。請解釋。

這是否意味着字符數組是動態的?

+2

不,這意味着你只是執行了緩衝區溢出。 C *不握住你的手*。如果有的話,它直接瞄準你的腳,只是等着你拉動扳機。 –

+0

它會覆蓋別的東西。在這種情況下可能未使用的內存,但嘗試像這樣:'int i1 = 5; char a [4]; int i2 = 6; printf(「i1,i2是%i,%i \ n」,i1,i2);得到的(a); printf(「i1,i2,a是%i,%i,%s \ n」,i1,i2,a);'。這是未定義的行爲,這意味着沒有任何保證,它可能取決於你的編譯器和操作系統(或者它可能會導致惡魔飛出你的鼻子 - 這在實踐中是不太可能的) – immibis

回答

3

也有人指出,這是不確定的行爲。這意味着當你有char a[4],並且你試圖訪問任何超出界限的東西(例如a[4] = 't'),那麼就不能保證你的程序的行爲。在某些情況下,它可能會起作用,而在其他情況下,它可能會崩潰。由於沒有保證,因此依靠這樣的代碼尤其沒用。

gets()的問題是你不能告訴它緩衝區有多大,所以它不知道何時停止寫入所提供的緩衝區。您在11個字符輸入,並gets已經執行相當於:

a[0] = 'm'; 
a[1] = 'e'; 
a[2] = 'l'; 
a[3] = 'w'; 
a[4] = 'i'; // at this point, we are writing out-of-bounds 
a[5] = 'n'; 
/* ... etc ... */ 
a[12] = '\0'; 

在C,有沒有自動的邊界檢查,並有根本沒有保證,而會發生什麼。

寫入不受限制的緩衝區的函數通常被認爲是不安全的(除非函數被記錄爲不超過特定數量的字符等)。

6

不,C中的數組不是動態的,你看到的是未定義的行爲,因爲緩衝區溢出。

而這就是你不應該使用gets()的原因,而應該使用fgets(),這樣可以防止緩衝區溢出。

+0

我應該在哪裏使用獲得?編程中的哪些部分(通常)會得到()幫助我們? fgets()作爲指針使用。不要讓程序變得複雜? – MELWIN

+2

@MELWIN你應該**從不**使用'gets()'。改爲使用'fgets()'和'stdin'。事實上,在最新的C標準(C11)中,'gets()'已被刪除。 –

+0

謝謝。我仍然使用turbo C++。 當輸入小於或等於4時,它不返回任何緩衝區溢出。謝謝你的答案 – MELWIN

0

gets()工作是由編譯器未定義的任何事情都可能發生使用fgets。

Check Here

0

獲取函數在C中使用是危險的。通過使用fgets函數避免它。