2013-03-11 20 views
6

Ich habe eine "Auto" -Struktur mit einem Modell (char * -Modell) und dem Jahr des Modells (int Jahr) definiert. Ich habe eine Funktion, die ein neues Auto struct erstellen wird; Beim Kopieren der Zeichenzeiger wird jedoch ein Fehler verursacht. Dies soll einen neuen Knoten für eine verknüpfte Liste erstellen.Füllen eines Char-Zeigers in einer Struktur

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; 
} 
+0

Wie wäre es 'neuen-> Modell = malloc (strlen (Modell) + 1)'? – cnicutar

+4

Sie sollten überprüfen, dass 'char * model' nicht' NULL' ist. Überprüfen Sie auch immer die Rückgabe von 'malloc's. – congusbongus

+0

@cnicutar danke; Die Probleme sind jedoch immer noch vorhanden. – kyle

Antwort

2

Für die Zukunft diese Funktion mein Problem behoben ...

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; 
} 
+1

Sie haben die falsche Menge an Speicherplatz mallokiert. Es sollte "strlen (Modell) + 1" sein. Wenn das Ihr Problem zu beheben schien, sind Sie auf Eierschalen gegangen! –

+0

@ M.M Sie haben Recht! Ich habe meine alten Hausaufgaben vom ersten Semester an durchgesehen und festgestellt, dass ich die Lösung nie gepostet habe. Ich habe meine Antwort aktualisiert, um den aufgetretenen Fehler wiederzugeben. – kyle

3

Hier ist Ihr Modell Zeichenzeiger.

Aber strcpy erfordert zwei Argumente - das array oder character pointer to which memory allocated by malloc or calloc

Aber Ihre strcpy(); nimmt ein Argument als Zeichenzeiger sein sollte, die werden nicht akzeptiert.

machen so

new->model = malloc(strlen(model) + 1) und geben Sie anschließend Ihre strcpy () es funktionieren wird.

+1

oder 'neues-> modell = strdup (modell);' was macht das das gleiche in einer einzigen Anweisung. –

+1

@EdouardThiel Außer 'strdup' ist nicht Standard (obwohl es leicht implementiert werden kann). – cnicutar

+0

strdup() entspricht SVr4, 4.3BSD, POSIX.1-2001. –

1

Werfen Sie einen Blick auf den Code unten und vergleichen Sie es mit Ihrem Programm, bin sicher, werden Sie feststellen, was mit Ihrem Programm falsch

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

Sie können dies versuchen:

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

Dies verhindert Sie von einem Fehler, wenn Modell ist NULL, sonst malloc Sie die genaue Menge an Speicherplatz und strcopy es; Plus, dies ermöglicht Ihnen in allen Fällen am Ende free(new->model).

Verwandte Themen