ошибка сегментации в C - PullRequest
       1

ошибка сегментации в C

0 голосов
/ 03 декабря 2010

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

#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;
}

Ответы [ 7 ]

5 голосов
/ 03 декабря 2010
  • Вам необходимо выделить память для поля имени: p[i].name = (char*)malloc(MAX_NAME_LEN)
  • Также, scanf("%s", &p[i].name) должно читать scanf("%s", p[i].name).
1 голос
/ 03 декабря 2010

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

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

или выделите память, используя malloc

1 голос
/ 03 декабря 2010

Поле структуры name - это просто указатель на дикий символ.

char* name;

вы читаете ввод пользователя как:

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

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

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

char name[MAX];
1 голос
/ 03 декабря 2010

Вам не нужен оператор & при сканировании указателя. И вам нужно malloc p[i].name

       scanf("%s", p[i].name);
0 голосов
/ 03 декабря 2010

Вам необходимо выделить память для строки "name" в вашей структуре. Сделайте это, используя malloc () или объявив name как массив заданного размера (char name [SIZE]).

0 голосов
/ 03 декабря 2010

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

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

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

0 голосов
/ 03 декабря 2010

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

...