2013-03-11 36 views
6

Tôi đã xác định cấu trúc "ô tô" với mô hình (mô hình char *) và năm của mô hình (năm int). Tôi có một chức năng sẽ tạo ra một cấu trúc xe mới; Tuy nhiên, nó là seg lỗi khi sao chép các con trỏ char. Điều này được cho là tạo ra một nút mới cho một danh sách liên kết.Điền một con trỏ char vào một cấu trúc

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

Làm thế nào về 'mới-> mô hình = malloc (strlen (mô hình) + 1) '? – cnicutar

+4

Bạn nên kiểm tra rằng 'char * model' không phải là' NULL'. Ngoài ra, như là thực hành tốt, luôn luôn kiểm tra sự trở lại của 'malloc' s. – congusbongus

+0

@cnicutar cảm ơn; tuy nhiên, vấn đề vẫn còn đó. – kyle

Trả lời

2

Để tham khảo trong tương lai chức năng này cố định vấn đề của tôi ...

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

Bạn malloc'd số lượng không gian sai. Nó phải là 'strlen (model) + 1'. Nếu điều này xuất hiện để khắc phục vấn đề của bạn, bạn đã đi bộ trên vỏ trứng! –

+0

@ M.M bạn nói đúng! Tôi đã trải qua bài tập về nhà cũ của tôi từ năm thứ nhất và nhận ra rằng tôi chưa bao giờ đăng giải pháp. Tôi đã cập nhật câu trả lời của mình để phản ánh lỗi bạn gặp phải. – kyle

3

Ở đây mô hình của bạn là con trỏ ký tự.

Nhưng strcpy yêu cầu hai đối số - cần được array hoặc character pointer to which memory allocated by malloc or calloc

Nhưng strcpy(); bạn mất một đối số là con trỏ nhân vật đó sẽ không được chấp nhận.

do đó hãy chắc

new->model = malloc(strlen(model) + 1) và sau đó viết của bạn strcpy () nó sẽ làm việc.

+1

hoặc 'new-> model = strdup (model); ' giống nhau trong một hướng dẫn duy nhất. –

+1

@EdouardThiel Ngoại trừ 'strdup' không phải là tiêu chuẩn (mặc dù nó có thể dễ dàng được triển khai). – cnicutar

+0

strdup() phù hợp với SVr4, 4.3BSD, POSIX.1-2001. –

1

Hãy nhìn vào mã dưới đây và so sánh nó với chương trình của bạn, chắc chắn bạn sẽ tìm hiểu những gì xảy ra với chương trình của bạn

#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

Bạn có thể thử này:

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

ngăn chặn này bạn từ một lỗi nếu mô hình là NULL, khác malloc bạn số tiền chính xác của không gian và strcopy nó; Ngoài ra, điều này cho phép bạn free(new->model) ở cuối tất cả các trường hợp.

Các vấn đề liên quan