Mengisi pointer char dalam sebuah struct

Saya telah mendefinisikan struct "mobil" dengan model (char *model) dan tahun model (int tahun). Saya memiliki fungsi yang akan membuat struktur mobil baru; Namun, ada kesalahan saat menyalin pointer char. Ini seharusnya membuat simpul baru untuk daftar tertaut.

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 sumber
comment
Bagaimana dengan new->model = malloc(strlen(model) + 1) ?   -  person cnicutar    schedule 11.03.2013
comment
Anda harus memeriksa bahwa char *model bukan NULL. Selain itu, sebagai praktik yang baik, selalu periksa kembalinya mallocs.   -  person congusbongus    schedule 11.03.2013
comment
@cnicutar terima kasih; Namun, masalahnya masih ada.   -  person kyle    schedule 11.03.2013
comment
@Cong Xu char *model tidak akan pernah menjadi NULL karena memindai data dari file di fungsi lain.   -  person kyle    schedule 11.03.2013
comment
pertama-tama jangan gunakan nama variabel baru karena itu adalah kata kunci   -  person Kinjal Patel    schedule 11.03.2013
comment
@KinjalPatel, dia dapat dengan aman menggunakan new dengan kompiler c   -  person Barath Ravikumar    schedule 11.03.2013
comment
apakah kamu yakin char *model itu NULL dihentikan?   -  person Kinjal Patel    schedule 11.03.2013
comment
sudahkah Anda mencoba apa yang diusulkan cnicutar.....yaitu baru-›model = malloc(strlen(model) + 1)   -  person Kinjal Patel    schedule 11.03.2013


Jawaban (4)


Untuk referensi di masa mendatang, fungsi ini memperbaiki masalah saya...

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
Anda salah mengalokasikan jumlah ruang. Seharusnya strlen(model)+1. Jika ini tampaknya memperbaiki masalah Anda, Anda telah bertindak keras! - person M.M; 03.11.2015
comment
@M.M kamu benar! Saya sedang mengerjakan pekerjaan rumah lama saya dari tahun pertama dan menyadari bahwa saya tidak pernah memposting solusinya. Saya telah memperbarui jawaban saya untuk mencerminkan kesalahan yang Anda tangkap. - person kyle; 03.11.2015

Anda dapat mencoba ini:

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

ini mencegah Anda dari bug jika modelnya NULL, jika tidak, berikan Anda jumlah ruang yang tepat dan salin; ditambah lagi, ini memungkinkan Anda untuk free(new->model) di akhir dalam semua kasus.

person Edouard Thiel    schedule 11.03.2013

Di sini model Anda adalah penunjuk karakter.

Namun strcpy memerlukan dua argumen - yaitu array atau character pointer to which memory allocated by malloc or calloc

Tapi strcpy(); Anda mengambil satu argumen sebagai penunjuk karakter yang tidak akan diterima.

jadi buatlah

new->model = malloc(strlen(model) + 1) dan kemudian tulis strcpy () Anda itu akan berhasil.

person Hitesh Menghani    schedule 11.03.2013
comment
atau new->model = strdup (model); yang melakukan hal yang sama dalam satu instruksi. - person Edouard Thiel; 11.03.2013
comment
@EdouardThiel Kecuali strdup tidak standar (meskipun dapat dengan mudah diimplementasikan). - person cnicutar; 11.03.2013
comment
strdup() sesuai dengan SVr4, 4.3BSD, POSIX.1-2001. - person Edouard Thiel; 16.03.2013

Lihatlah kode di bawah ini dan bandingkan dengan program Anda, saya yakin Anda akan mengetahui apa yang salah dengan program Anda

#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