2013-08-12 4 views
0

나는 어디서 잘못 가고 왜?이 코드에서 fgets의 오류는 무엇입니까?

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
char *str; 
int length, i, j, flag = 0; 

printf("\n\nEnter string: "); 
fgets(str, 20, stdin); 
printf("You entered: %s", str); 
    return 0; 
} 

라인이 fgets(str, 20, stdin); 인 문제가 있습니다. 나는 그것을 이해할 수 없다. 문자열을 입력 한 후 컴파일러가 작동을 멈추고 다음과 같은 오류 메시지가 나타납니다. 이 프로그램의 작동이 중지되었습니다. 내가 잘못 가고있는 곳과이 문제의 해결 방법을 지적 해 주시겠습니까?

char * fgets (char * str, int num, FILE * stream); 

내가을 쉘는 MinGW에 숭고한 텍스트 2GCC를 사용하고 있습니다 : 표준 라이브러리는 fgets과 같이 정의한다.

포인터의 개념을 기반으로 다른 질문 : 이 char * str, char* strchar *str 사이에 어떤 차이가 있습니까?

답변

1

str

메모리를 할당하기 위해 내가 게시 된 코드가 필요이라는 변수에 메모리를 할당하지 않기 때문에 오류가 발생합니다.. 나는 그저 임의의 메모리 위치를 지정하고있다.

위의 코드가 올바르게 작동하려면 스택이나 힙에 메모리를 할당 할 수 있습니다.

스택에 할당하려면 char str[20]을 사용하고 힙에 메모리를 할당하려면 char *str = malloc(20) 또는 char *str = malloc(20*sizeof(char))을 사용하십시오.

스택 또는 힙에 대해 잘 모르는 경우 세부 정보에 대해 너무 걱정하지 마십시오. 그들 중 누구라도 간단한 콘솔 프로그램을 위해 할 것입니다. 내 다른 질문, 문제가되지 않습니다 char* str, char * strchar *str에서 *의 위치에 관해서는

. 그 중 3 개는 모두 동일합니다.

@ P0W의 대답과 관련하여 질문 한 또 다른 질문은 malloc에 의해 반환 된 메모리 주소를 char *str = malloc(20*sizeof(char))에 캐스팅하지 않은 이유입니다. 이 질문에 대한 답은 C에서 피할 필요가 없다는 것입니다. 대안을 얻으려면 stdlib.h 헤더 파일을 포함시킵니다.

자세한 내용은 StackOverflow question을 확인하십시오. 또는 C FAQ section을 볼 수도 있습니다.

+0

'static char str [20]'에서와 같이 _global_ memory를 사용할 수도 있습니다. 전형적으로 이것은 정당하게 싫은 일이지만 일부 경우에는 실행 가능한 옵션입니다. – chux

+0

@ ash9209,'malloc'의 반환 값을 캐스팅하면 코드를 읽는 다음 프로그래머가 도움이됩니다. 'stdlib.h'가 포함되어 있다면'malloc'을 명시 적으로 캐스팅하는 기술적 인 단점은 없습니다. – JackCColeman

1

str에 대한 메모리를 할당하지 않았습니다. 힙 할당의 경우 char *strchar *str = malloc(20);으로, 스택 할당의 경우 char str[20]으로 바꿉니다.

*의 위치는 중요하지 않습니다.이 세 문은 모두 동일합니다.

P. 숭고한 텍스트 2는 텍스트 편집기 일 뿐이며 사용하는 텍스트 편집기는 프로그램에 아무런 영향을 미치지 않습니다. 컴파일러와 운영체제는 중요합니다.

+0

경고 : malloc 함수를 추가 할 때 경고 메시지가 표시됩니다. ** 경고 : 기본 제공 함수 'malloc'의 암시 적 선언이 호환되지 않습니다. ** – ash9209

+0

'#include '프로그램 상단에 있습니다. –

+0

그래, 나는 텍스트 에디터는 말할 필요가 없다는 것을 알고있다. 그러나 stackoverflow에 꽤 오랫동안 있고, 많은 질문을 통해 브라우징, 일부 바보들이 너무 편집기에 대해 물어보십시오. 그래도 나는 그들이 무엇에서 빠져 나올지 모르겠다. – ash9209

4

당신은, 어떤 크기 128

char *str = malloc(128*sizeof(char));

또는 그래서 내 자신의 질문에 대답

char str[128];

+0

질문이 하나 더 있습니다. ** ** malloc ** 이전에 ** (char *) **를 typecast하지 않아도 될까요? – ash9209

+0

@ ash9209'malloc' 리턴 타입은'void *'입니다. 암시 적으로 다른 포인터 유형으로 변환되므로 불필요합니다. – P0W

+0

예, 이해했습니다. 정말 고마워. – ash9209