2010-12-03 6 views
0

이 코드를 작성하려고하지만 프로그램 실행 후 세그먼테이션 오류가 발생합니다.이 코드를 정렬하는 데 도움을 주시겠습니까? 포인터에 scanf'ing 때세그먼트 화 오류가

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

typedef struct{ 
    int salary; 
    char* name; 
} employee ; 

int main(){ 
    employee p[2]; 
     int i; 
     for(i=0;i<2; i++){ 
      printf("enter sal "); 
      scanf("%d", &p[i].salary); 

      printf("enter name "); 
      scanf("%s", &p[i].name); 
     } 
     for(i=0;i<2; i++){ 
      printf("p %d",p[i].salary); 
      printf("p %s",p[i].name); 
     } 
    return 0; 
} 

답변

1

구조 필드 name은 와일드 문자 포인터 일뿐입니다. 어느 곳이 될 수 name가 가리키는 메모리에

scanf("%s", &p[i].name); 

:

char* name; 

당신은 같은 사용자 입력을 읽고있다.

name이 가리키는 메모리를 동적으로 할당해야하거나 namechar 크기의 배열을 가능한 최대 길이보다 크게 변경할 수 있습니다.

char name[MAX]; 
1

당신은 & 운영자가 필요하지 않습니다. 또한 p[i].name = (char*)malloc(MAX_NAME_LEN)

  • scanf("%s", &p[i].name)scanf("%s", p[i].name)을 읽어야 할 사람 : 그리고 당신은 당신은 이름 필드에 메모리를 할당 할 필요가 p[i].name

     scanf("%s", p[i].name); 
    
  • 5
    • malloc을해야합니다.
    0

    p[i].name에 메모리를 할당하는 것을 잊었습니다.

    0

    당신은 employee의 각 인스턴스의 name 구성원에 대한 메모리를 예약 할 수 있습니다

    p[i].name = (char*)malloc(expected_max_size); 
    

    을 그냥 변수에 대한 scanf 전에. char char*에 대한 포인터를 선언하면 포인터가 가리키는 실제 문자열에 대한 메모리가 지정되지 않고 포인터 자체에 대한 메모리가 할당되며 예제에서는 초기화되지 않습니다. malloc을 사용하면 메모리 조각을 예약하고 포인터가 포인터를 가리키게됩니다. 경계 검사는 사용자가 작성한 내용을 담을 수 있도록 미리 예약해야하기 때문에 조심해야합니다.

    1

    char * name에 대한 메모리를 할당하지 않았습니다.

    typedef struct 
    { 
        int salary; 
        char name[50]; 
    } 
    

    에 데이터 구조를 변경하거나 malloc에 ​​

    당신은 당신의 구조에서 "이름"문자열에 대한 메모리를 할당 할 필요가
    0

    를 사용하여 메모리를 할당합니다. malloc()을 사용하거나 이름을 주어진 크기의 배열 (char name [SIZE])로 선언하여이 작업을 수행하십시오.

    관련 문제