Tôi biết câu hỏi này đã xảy ra, nhưng tôi thấy câu trả lời hơi mờ, dài hoặc khó hiểu; vì vậy tôi sẽ đặc biệt tham khảo mã của tôi để có được điểm đầy đủ.Phân bổ bộ nhớ cho một chuỗi bên trong một cấu trúc
vì vậy tôi đã struct này:
typedef struct album {
unsigned int year;
char *artist;
char *title;
char **songs;
int songs_c;
} album ;
các chức năng sau:
struct album* init_album(char *artist, char *album, unsigned int year){
struct album *a;
a= malloc(sizeof(struct album));
a->artist = malloc(strlen(artist) + 1);
strncpy(a->artist, artist, strlen(artist));
a->title = malloc(strlen(album) + 1);
strncpy(a->title, album, strlen(album));
a->year = year;
return a;
}
void add_song(struct album *a, char *song){
int index = a->songs_c;
if (index == 0){
a->songs = malloc(strlen(song));
} else a->songs[index] = malloc(strlen(song)+1);
strncpy(a->songs[index], song, strlen(song));
a->songs_c= a->songs_c+1;
}
Và một chức năng chính:
int main(void){
char *name;
char artist[20] = "The doors";
char album[20] = "People are strange";
int year = 1979;
struct album *a;
struct album **albums;
albums = malloc(sizeof(struct album));
albums[0] = init_album((char *)"hihi", (char *)"hoho", 1988);
albums[1] = init_album((char *)"hihi1", (char *)"hoho1", 1911);
printf("%s, %s, %d\n", albums[0]->artist, albums[0]->title, albums[0]->year);
printf("%s, %s, %d\n", albums[1]->artist, albums[1]->title, albums[1]->year);
char song[] = "song 1\0";
add_song(albums[1], song);
free(albums[0]);
free(albums[1]);
}
Segmentation lỗi khi phát hành strncpy để thêm một bài hát trong "add_song()".
Tôi đang làm gì sai nghiêm trọng? khi nghe nói nhiều lần, không có cách thực hiện "đúng" trong c, miễn là nó hoạt động và nó không lỗi, nó là ok, nhưng khi mới bắt đầu sẽ là tuyệt vời để nhận được một số phản hồi thận trọng hoặc lời khuyên về việc sử dụng phân bổ bộ nhớ cùng với các cấu trúc dữ liệu phức tạp.
Cảm ơn một nhóm! /s
bài hát char [] = "bài hát 1 \ 0"; Điều này cho biết thêm hai ký tự chấm dứt null. Ngay sau khi bạn sử dụng "", trình biên dịch sẽ thêm một chấm dứt null vô hình cho bạn, bạn không phải làm điều đó theo cách thủ công. "x" giống với {'x', '\ 0'}. – Lundin
@Vlad Đó là một sự lựa chọn khó khăn. Hoặc viết bằng C/C++ và dành 90% thời gian của người lập trình để quản lý bộ nhớ, hoặc chọn một ngôn ngữ khác và dành 90% thời gian thực hiện chương trình cho cùng một mục đích. =) – Lundin
@Lundin: Không chính xác. Tôi muốn nói rằng nếu bạn cần phân bổ/giải phóng bộ nhớ trên một con đường quan trọng - đó là một thiết kế xấu, và là một vấn đề không có vấn đề gì bạn sử dụng C hoặc C++, nếu không sử dụng 'std :: string' từ C++ sẽ không gây hại cho hiệu suất của bạn, đặc biệt là nếu bạn có một nhóm đối tượng (hoặc thậm chí cả đối tượng không có khóa). –