2017-04-21 1 views
-3

이 코드를 고려 :이유는()는 문자 포인터 인수를 도착하지 않는 이유는 무엇입니까?

#include <stdio.h> 

int main() 
{ 
    char *s; 
    gets(s); 
    printf("%s",s); 
    return 0; 
} 

나는 stdin에서 일부 입력을 입력 한 후,이 경우 런타임 오류가 발생합니다. s가 배열, s[size]로 선언 그러나 경우에는 문제가 없다. 그러나 gets 프로토 타입을 고려, char *gets(char *s);는 작동하지해야합니까?

+2

'대상'을 가리키는 메모리를 할당하지 않았습니다. – Barmar

+0

's = malloc (BUFSIZE); ' – Barmar

+3

1) 설명서를 읽었습니까? ** **'char *'를 취합니다. 2) ** 절대'gets'를 사용하지 마십시오 ** 표준에서 제거되었으며 모든 현대 라이브러리는 사용하려고하면 경고합니다. – Olaf

답변

2

gets 기능은 s 문자열을 받아 들일 수있는 문자 배열을 가리 키도록 기대하고있다. 그러나이 경우 s은 초기화되지 않습니다. 그래서 초기화되지 않은 포인터 역 참조에 gets 시도합니다. 그러면 undefined behavior이 호출됩니다.

s을 기존 배열을 가리 키도록 설정하거나 malloc을 사용하여 공간을 할당 한 경우 성공적으로 쓸 수 있습니다.

반대로 s이 배열로 정의되면 gets으로 전달 될 때 배열의 첫 번째 요소에 대한 포인터로 사라집니다. 그런 다음 gets이 어레이에 쓸 수 있습니다.

그러나 gets은 전달한 버퍼의 크기를 확인하지 않으므로 안전하지 않습니다. 사용자가 버퍼보다 ​​문자열 큰 입력하면, gets 다시 정의되지 않은 동작을 호출하는 버퍼의 끝을지나 작성합니다.

대신 매개 변수로 버퍼의 크기를 허용하는 fgets을 사용해야합니다.

관련 문제