权现在,您的每张专辑都有一首曲目,曲目名称预计为单个字符,即i除了你可能想要的,一个字符数组。
您已经正确地分配了您的专辑,但您也需要分配每个专辑的曲目。
最简单的方法是只指定一个固定数量的轨道作为最大值,并确保其他代码不超过该数量。
const int MAX_TRACKS = 20;
const int MAX_HITS = 20;
const int MAX_TRACK_NAME_LENGTH = 63;
struct track_{
char tracks_title[MAX_TRACK_NAME_LENGTH+1];
int playlist_hits[MAX_HITS];
int playlist_hits_count;
};
struct album_ {
int num_tracks;
struct track_ tracks[MAX_TRACKS];
};
或者,您可以动态分配曲目和曲目名称到所需的确切大小,如果您拥有该信息便利。例如,假设你只是在做专辑的现有阵列的副本:
struct track_ {
char *track_title;
int *playlist_hits;
int playlist_hits_count;
};
struct album_ {
int num_tracks;
struct track_ *tracks;
};
typedef struct album_ album;
typedef struct track_ track;
album *copy_albums(album *all_albums_p, int number_of_album) {
album *all_albums_copy = (album *)malloc(sizeof(album) * number_of_album);
// copy each album
for (int album_i = 0; album_i < number_of_album; album_i++) {
album * current_album = all_albums_p + album_i;
album * copy_album = all_albums_copy + album_i;
copy_album->num_tracks = current_album->num_tracks;
copy_album->tracks = (track *)malloc(sizeof(track) * current_album->num_tracks);
// copy each track, and it's hits, and make a new copy of it's name
for (int track_i = 0; track_i < current_album->num_tracks; track_i++) {
track * current_track = current_album->tracks + track_i;
track * copy_track = copy_album->tracks + track_i;
copy_track->playlist_hits_count = current_track->playlist_hits_count;
copy_track->playlist_hits = (int *)malloc(sizeof(int) * current_track->playlist_hits_count);
memcpy(copy_track->playlist_hits, current_track->playlist_hits, current_track->playlist_hits_count * sizeof(int));
copy_track->track_title = _strdup(current_track->track_title);
}
}
return all_albums_copy;
}
'char track_title'几乎肯定是错的。 – 2012-03-31 19:52:55
你的代码已经是正确的解决方案,你可以使用'all_albums_p [i]'来访问数组 – thumbmunkeys 2012-03-31 19:53:19
如何为tracks_title中的字符串分配? – 2012-03-31 19:54:28