2010-12-03 2 views
0

Я пытаюсь написать этот код, но он дает мне ошибку сегментации после запуска программы, не могли бы вы помочь ее разобраться?ошибка сегментации в C

#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 - это просто дикий указатель на символ.

char* name; 

вы читаете ввод данных пользователем, как:

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

в памяти, указываемой name который может быть где угодно.

Чтобы это исправить, необходимо динамически выделять память, на которую указывает name или вы можете изменить name на char массив размером на один больше, чем максимальная длина имени возможно.

char name[MAX]; 
1

Вам не нужно оператору & когда scanf'ing указателю. И вам нужно таНос p[i].name

 scanf("%s", p[i].name); 
5
  • Вам нужно выделить память для поля имя: p[i].name = (char*)malloc(MAX_NAME_LEN)
  • Кроме того, scanf("%s", &p[i].name) следует читать scanf("%s", p[i].name).
0

Вы забыли выделить для памяти p[i].name.

0

Вы должны зарезервировать память для name члена каждого экземпляра employee:

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

непосредственно перед scanf для этой переменной. Объявление указателя на char char* не присваивает памяти для указанной фактической строки, но только для самого указателя, а в вашем примере это не инициализируется. Используя malloc, вы резервируете фрагмент памяти и накладываете на нее указатель. Вы должны быть осторожны с проверкой границ, потому что вы должны заранее зарезервировать память, чтобы удерживать то, что пишет пользователь.

1

Вы не выделяете память для char * name. изменить структуру данных

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

или выделять память с помощью таНос

0

Вам нужно выделить память для «имя» строки в вашей структуре. Выполните это с помощью malloc() или объявив имя как массив заданного размера (имя символа [SIZE]).

Смежные вопросы