2012-06-25 2 views
1

사용자 입력을 받아서 인쇄하는 간단한 프로그램을 작성하려고합니다. 사용자가 "done"을 입력 할 때까지이 작업을 계속 수행해야합니다.getline()으로 입력시 세그먼트 오류가 발생했습니다.

아래 코드를 실행하면 "01"을 입력 한 다음 Segmentation Fault (core dumped)이 표시됩니다.

이 내용은 getline()과 관련이 있다고 생각하지만 잘 모르겠습니다. 왜 누군가가 내게 왜 작동하지 않고 어떻게 고칠 수 있는지 설명 할 수 있으면 감사하겠습니다.

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

char* line; 
size_t size ; 
size = 100; 
char* done; 
done = "done"; 
printf("0"); 
while (strcmp(line, "done") != 0) { 
    printf("1"); 
    getline(&line, &size, stdin); 
    printf("2"); 
    printf("%s\n", line); 
    } 
return 0; 
} 

답변

9

그냥 아무것도 (실제로 쓰레기)를 가리키는 포인터를 가지고 : 더 이상 필요가 메모리를 기억하지 않을 때, 예를 들어 메모리를 할당 할 line = malloc(size);

+1

'malloc '이 아닌 객체를'getline'에 넘길 수 없습니다. http://www.gnu.org/software/libc/manual/html_node/Line-Input.html * getline을 호출하기 전에 * lineptr에 malloc *으로 할당 된 버퍼의 주소를 * n 바이트 길어야합니다. 이것에 대한 이론적 근거는 'getline'은 버퍼 크기가 라인을 유지하기에 충분하지 않은 경우 객체를 '재 할당'할 수 있다는 것입니다. – ouah

+1

예, 죄송합니다. 나는 그것을 반영하기 위해 해답을 편집했다. –

+0

나는 이것을 6 개월 동안 붙들 렸고, 고마워. –

5

당신은 메모리를 할당되지 않습니다 유효한 객체를 가리키는 전에

char* line; 

line 유효하지 않은 포인터입니다.

다음
free(line); 
1
char* line = malloc(size * sizeof(char)); 

malloc를 사용

getline()에 대한 매뉴얼 페이지에서
char* line; 

:

* lineptr이 NULL이면 getline()은 사용자 프로그램에 의해 해제되어야하는 행을 저장하기위한 버퍼를 할당합니다. (이 경우 * n의 값은 무시됩니다.)

getline()을 호출하기 전에 * lineptr에 malloc (3) 할당 버퍼 * n 바이트 크기의 포인터를 포함 할 수 있습니다. 버퍼가 라인을 보관할만큼 크지 않으면, getline()은 realloc (3)으로 크기를 조정하고 필요에 따라 * lineptr 및 * n을 업데이트합니다.

성공적인 호출에서 * lineptr 및 * n은 각각 버퍼 주소와 할당 된 크기를 반영하도록 업데이트됩니다.

따라서 은 getline에 스택 할당 버퍼를 사용할 수 없습니다.

char* line = NULL; 
int size = 0; 
getline(&line, &size, stdin); // line and size are updated with buffer addr and size. 
//... 
free(line); 
+0

이 좋아, 그래서의 getline 크기에 값을 반환하지 :

이 작업을 수행하는 쉬운 방법은 NULL로 line을 초기화하고 getline 당신을위한 할당을 처리 할 수 ​​있도록하는 것입니다? –

관련 문제