Ошибка сегментации в strcpy ()

У меня есть базовая структура, подобная этой

typedef struct struck { char* id; char* mat; int value; char* place; } *Truck; 

И такой эффект, который создает новый «экземпляр» этой структуры:

 Truck CTruck(char* id, char* mat, int value, char* place) { Truck nT = (Truck) malloc(sizeof (Truck)); nT->value = value; strcpy(nT->id, id); strcpy(nT->mat, mat); strcpy(nT->place, place); return nT; } 

Я получаю сообщение об ошибке в первой strcpy . Он компилируется без проблем.

Ваш typedef определяет Truck как struct struck * , то есть указатель. Так что размер будет 4 или 8 зависимости от архитектуры, а не от размера структуры

Используйте sizeof(*Truck) чтобы получить фактический размер структуры.

Вам также необходимо выделить память для символов. Самый простой способ – использовать strdup() .

 Truck CTruck(const char* id, const char* mat, int value, const char* place) { Truck nT = malloc(sizeof (*Truck)); nT->value = value; nT->id = strdup(id); nT->mat = strdup(mat); nT->place = strdup(place); return nT; } 

Однако я бы предложил изменить ваш typedef, чтобы он был псевдонимом для структуры, а не для указателя на него:

 typedef struct { char* id; char* mat; int value; char* place; } Truck; 

В вашей функции вы затем используете это:

 Truck *nT = malloc(sizeof(Truck)); 

nT->id – это просто указатель. Необходимо скопировать память, чтобы скопировать строку. То же самое для других.

Недопустимое использование параметра sizeof . В общем случае аргумент malloc() должен быть «размером, на который указывает возвращаемый указатель». Другими словами, вам нужен sizeof *nT . Посмотрите, как это исключает повторение имени типа ( Truck )?

Кроме того, в C вам не нужно указывать возвращаемое значение malloc() ; это нецелесообразно, может скрыть реальную ошибку и сделать код более трудным для чтения.

Как указывали другие, вы также не выделяете пространство для любых строковых данных, все, что у вас есть, являются указателями в вашей структуре.

  • Ошибка сегментации в glGenVertexArrays (1, & vao);
  • Ошибка сегментации при больших размерах массива
  • Ошибка сегментации, большие массивы
  • Segfaults в malloc () и malloc_consolidate ()
  • segmentation fault с помощью scanf
  • Давайте будем гением компьютера.