2013-03-11 18 views
6

Zdefiniowałem strukturę "samochodu" z modelem (model char *) i rokiem modelu (rok int). Mam funkcję, która stworzy nową strukturę samochodu; jednakże podczas kopiowania wskaźników znakowych jest on uszkodzony. Ma to na celu utworzenie nowego węzła dla połączonej listy.Wypełnianie wskaźnika znaku w struct

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

Jak o wczesne wykrywanie chorób> 'Model = malloc (strlen (model) + 1)'? – cnicutar

+4

Należy sprawdzić, czy 'char * model' nie ma wartości' NULL'. Jako dobrą praktykę, zawsze sprawdź powrót 'malloc's. – congusbongus

+0

@cnicutar thanks; jednak problemy nadal istnieją. – kyle

Odpowiedz

2

Dla przyszłości ta funkcja stałej mój problem ...

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

You malloc'd niewłaściwą ilość miejsca. Powinien to być "strlen (model) + 1". Jeśli wydaje się, że rozwiązałeś problem, chodziłeś po skorupkach! –

+0

@ M.M masz rację! Przejrzałem moje stare zadania domowe z pierwszego roku i zdałem sobie sprawę, że nigdy nie opublikowałem rozwiązania. Zaktualizowałem swoją odpowiedź, aby odzwierciedlić błąd, który Cię złapał. – kyle

3

Tutaj Twój model jest wskaźnikiem znaków.

Ale strcpy wymaga dwóch argumentów - że powinny być array lub character pointer to which memory allocated by malloc or calloc

Ale twój strcpy(); trwa jeden argument jako wskaźnik znaków, które nie będą akceptowane.

tak zrobić

new->model = malloc(strlen(model) + 1) a następnie napisać swój strcpy () będzie działać.

+1

lub 'New-> Model = strdup (model), który robi' tak samo w jednej instrukcji. –

+1

@EdouardThiel Z wyjątkiem 'strdup' nie jest standardem (choć można go łatwo zaimplementować). – cnicutar

+0

strdup() jest zgodny z SVr4, 4.3BSD, POSIX.1-2001. –

1

Wystarczy popatrzeć na poniższym kodzie i porównać ją z programu, jestem pewien, że będzie dowiedzieć się, co się stało z programem

#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

Możesz spróbować tego:

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

Zapobiega jesteś z błędu, jeśli model ma wartość NULL, w przeciwnym razie wyciśniesz dokładną ilość miejsca i go skopiuj; plus, to pozwala ci na koniec we wszystkich przypadkach.