Ошибка сегментации в 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
. Он компилируется без проблем.
- SegFault после scanf?
- Что может привести к ошибкам сегментации в C ++?
- Окончательный список общих причин сбоев сегментации
- Почему этот код разворота строки C вызывает ошибку сегментации?
- Ошибка сегментации перед основным
- Что такое segmentation fault?
- Каков самый простой стандарт, способный создать Segfault в C?
- Почему я не получаю ошибку сегментации, когда пишу за пределами массива?
- Почему java-приложение врезается в gdb, но работает нормально в реальной жизни?
- strtok дает ошибку сегментации
- Ошибка сегментации cudaMemcpy
- Ошибка сегментации в реализации btree
- Как уловить ошибку сегментации в Linux?
Ваш 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()
; это нецелесообразно, может скрыть реальную ошибку и сделать код более трудным для чтения.
Как указывали другие, вы также не выделяете пространство для любых строковых данных, все, что у вас есть, являются указателями в вашей структуре.