2014-01-21 1 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); gets (a); printf ("i1, i2, a는 % i, % i, % s \ n", i1, i2, a);'. 이것은 아무런 보장이 없다는 것을 의미하는 정의되지 않은 동작이며 컴파일러와 운영체제에 달려 있습니다 (또는 악마가 코를 날아갈 수도 있습니다 - 실제로는 거의 일어나지 않을 것입니다) – immibis

답변

3

다른 사람은이 정의되지 않은 동작이라고 지적했다. 즉, char a[4]이 있고 범위를 벗어난 항목 (예 : a[4] = 't')에 액세스하려고하면 프로그램 작동 방식에 대한 보장이 없습니다. 경우에 따라 작동 할 수도 있고, 그렇지 않은 경우 충돌 할 수도 있습니다. 보증이 없으므로, 그러한 코드에 의존하는 것은 특히 유용하지 않습니다.

gets()의 문제점은 버퍼의 크기를 알 수 없으므로 제공된 버퍼에 기록을 중지 할시기가 언제인지 알 수 없습니다. 당신은 11 개 문자로 입력하고, gets가에 해당하는 수행 : C에서

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'; 

을 더 자동 경계 확인이없고, 무슨 일이 일어날 지에 관해서는 보장은 단순히 없습니다.

제한 할 수없는 버퍼에 작성하는 함수는 일반적으로 안전하지 않은 것으로 간주됩니다 (함수가 특정 수의 문자 등을 쓰지 않는 것으로 문서화되어 있지 않은 경우).

6

아니요, C 배열은 동적이지 않습니다. 버퍼 오버플로로 인해 정의되지 않은 동작이 표시됩니다.

gets()을 사용하면 안되며, 대신 fgets()을 사용하면 버퍼 오버플로를 방지 할 수 있습니다.

+0

어디에서 사용해야합니까 ??? 프로그래밍 (일반적으로)의 어느 부분에서 gets()가 도움이됩니까? fgets()는 포인터로 작동합니다. 프로그램을 복잡하게 만들지 않습니까? – MELWIN

+2

@MELWIN 당신은 ** 결코 ** gets()를 사용해서는 안됩니다.'fgets()'대신'stdin'을 사용하십시오. 실제로 최신 C 표준 (C11)에서'gets()'가 제거되었습니다. –

+0

감사합니다. 나는 여전히 터보 C++를 사용하고있다. 입력이 4보다 작거나 같으면 버퍼 오버플로를 반환하지 않습니다. 답변 감사합니다 – MELWIN

0

gets() 작업은 컴파일러에서 정의되지 않았기 때문에 fgets를 사용할 수 있습니다.

Check Here

0

gets 기능은 C에서 사용하는 것은 위험합니다. fgets 기능을 사용하여 피하십시오.