2017-10-22 2 views
0

이 프로그램을 실행하면 이름을 입력 할 수있게되어 세그먼트 화 오류가 발생합니다.루프에있는 파일에 쓰지만 분할 오류가 발생하는 경우

나는 왜 이런 일이 일어나는지, 어떻게 없앨 지 모른다.

#include <stdio.h> 

int main (void) 
{ 
     FILE *fp; 

     fp = fopen("list.txt","a+"); 
     if (fp == NULL){ 
       printf("File list.txt could not be opened."); 
     } 

     for(int i=0;i<3;i++){ 
       char *name; 
       char *str; 
       char *sta; 
       printf("Please enter your name: "); 
       scanf("%s",name); 
       printf("Please enter your street: "); 
       scanf("%s",str); 
       printf("Please enter your state: "); 
       scanf("%s",sta); 
       fprintf(fp,"%s,%s,%s\n",name,str,sta); 
     } 
     fclose(fp); 
} 
+1

첫 번째 질문 : 디버거는 무엇을 말합니까? – tadman

+2

힌트 :'char * name'은'scanf'에서 바로 사용할 수있는 문자 버퍼가 아닙니다. 초기화되지 않았습니다. 공간이 할당되지 않았습니다. 폭발 할 것입니다. – tadman

+0

scanf에 대한 [설명서] (http://www.cplusplus.com/reference/cstdio/scanf/)의 내용 : ... (추가 인수) 형식 문자열에 따라 함수는 추가 시퀀스 인자들, ** 각각 할당 된 저장 공간에 대한 포인터를 포함 ** ** 추출 된 문자들의 해석이 적절한 타입으로 저장되어있는 곳의 '(emphasis mine) – Les

답변

0

컴파일러가 정확히 컴파일 할 때 말하는 내용은 무엇입니까? 귀하의 문제는 scanf를 사용하는 방식에서 가장 가능성이 높습니다. 예, scanf는 변수에 대한 주소/포인터를 취합니다. 그러나이 시점에서 가지고있는 char * 변수는 초기화되지 않았고 가비지를 포함 할 가능성이 높습니다. 대신 char 배열 (char []) 변수를 사용하십시오. 또는 malloc과 같은 동적 메모리 할당자를 호출하거나 다른 기존 문자 배열의 주소를 저장하여 char 포인터 (char *)를 초기화하는 대체 방법을 사용할 수도 있습니다.

보너스 : 예, char name [10]은 char * p = malloc (10)과 같습니다. Char name [10]은 각각 10 바이트 크기의 배열이며 char "name"변수는 암시 적으로 10 문자의 첫 번째 요소에 대한 포인터이고 malloc (10)은 10 바이트에 대한 포인터를 반환합니다 메모리에. 둘 다 10 바이트에 대한 포인터를 생성합니다.

+0

예, char name [10] 및 char * name = malloc (10)으로 작업 할 수있게되었습니다. 궁금 해서요. 이것들은 같은 것입니까? 아니면 미묘한 근본적인 차이가 있습니까 –

+0

귀하의 의견에 대한 답변을 편집했습니다. :) – redBhutan

+0

도와 줘서 고마워! –

관련 문제