Заполнение указателя char в структуре

Я определил структуру «автомобиль» с моделью (char *model) и годом модели (int year). У меня есть функция, которая создаст новую структуру автомобиля; однако при копировании указателей на символы возникает ошибка seg. Предполагается, что это создаст новый узел для связанного списка.

Car *newCar(char *model, int year){
    Car *new = malloc(sizeof(Car));
    new->year = year;
    new->model = malloc(MAX_LENGTH*sizeof(char));
    strcpy(new->model, model);
    new->next = NULL;
    return new;
}

person kyle    schedule 11.03.2013    source источник
comment
Как насчет new->model = malloc(strlen(model) + 1) ?   -  person cnicutar    schedule 11.03.2013
comment
Вы должны проверить, что char *model не является NULL. Кроме того, в качестве хорошей практики всегда проверяйте возврат mallocs.   -  person congusbongus    schedule 11.03.2013
comment
@cnicutar спасибо; тем не менее, проблемы все еще есть.   -  person kyle    schedule 11.03.2013
comment
@Cong Xu char *model никогда не будет NULL, потому что он сканирует данные из файла в другой функции.   -  person kyle    schedule 11.03.2013
comment
во-первых, не используйте new в качестве имени переменной, так как это ключевое слово   -  person Kinjal Patel    schedule 11.03.2013
comment
@KinjalPatel, он может безопасно использовать new с компилятором c   -  person Barath Ravikumar    schedule 11.03.2013
comment
Вы уверены, что char *model завершается NULL?   -  person Kinjal Patel    schedule 11.03.2013
comment
Вы пробовали то, что предложил cnicutar..... это new->model = malloc(strlen(model) + 1)   -  person Kinjal Patel    schedule 11.03.2013


Ответы (4)


Для дальнейшего использования эта функция исправила мою проблему...

Car *createCar(char *model, int year){
    Car *new = malloc(sizeof(Car));
    new->year = year;
    new->model = malloc(strlen(model)+1);
    strcpy(new->model, model);
    new->next = NULL;
    return new;
}
person kyle    schedule 02.11.2015
comment
Вы выделили неправильное количество места. Должно быть strlen(model)+1. Если это решило вашу проблему, вы ходили по яичной скорлупе! - person M.M; 03.11.2015
comment
@M.M, ты прав! Я просматривал свои старые домашние задания с первого года обучения и понял, что никогда не публиковал решение. Я обновил свой ответ, чтобы отразить обнаруженную вами ошибку. - person kyle; 03.11.2015

Вы можете попробовать это:

new->model = model == NULL ? NULL : strdup(model);

это предотвратит ошибку, если модель имеет значение NULL, в противном случае вы можете выделить точное количество места и выполнить его strcopy; плюс, это позволяет вам free(new->model) в конце во всех случаях.

person Edouard Thiel    schedule 11.03.2013

Здесь ваша модель - указатель на символ.

Но strcpy требует два аргумента — это должно быть array или character pointer to which memory allocated by malloc or calloc.

Но ваш strcpy(); принимает один аргумент в качестве указателя на символ, который не будет принят.

так сделай

new->model = malloc(strlen(model) + 1) а потом напишите свой strcpy () все будет работать.

person Hitesh Menghani    schedule 11.03.2013
comment
или new->model = strdup (model);, который делает то же самое в одной инструкции. - person Edouard Thiel; 11.03.2013
comment
@EdouardThiel За исключением того, что strdup не является стандартным (хотя его легко реализовать). - person cnicutar; 11.03.2013
comment
strdup() соответствует SVr4, 4.3BSD, POSIX.1-2001. - person Edouard Thiel; 16.03.2013

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

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

typedef struct car{
char *model;
int year;
}Car;

Car * newCar(char *, int );

int main()
{

Car *benz = newCar("S-class",1990);

printf("\nModel = %s\n",benz->model);
printf("\nYear = %d\n",benz->year);

}

Car * newCar(char *model, int year)
{
    Car *new = malloc(sizeof(Car));
    new->year = year;
    new->model = malloc(strlen(model));
    strcpy(new->model, model);
    return new;
}
person Barath Ravikumar    schedule 11.03.2013