我有以下代码,它会将未分类的歌曲和艺术家列表排序并显示出来。
int main()
{
SongList totalList; // has a public 2d array 'unsortedSongs' variable
char songs[100][80] =
{
{"David Bowie 'Ziggy Stardust'",},
{"Smokey Robinson 'You've Really Got A Hold On Me'",},
{"Carole King 'You've Got A Friend'",},
// many more songs here totaling to 100
{"Joni Mitchel 'A Case Of You'",},
{"Prince 'Kiss'"}
};
memcpy(&totalList.unsortedSongs, &songs, sizeof(songs)); // this causes a segmentation fault
totalList.displaySortedList();
return 0;
}
我几乎直接从示例here中获取了memcpy的代码,所以我很困惑为什么这不起作用。有人可以帮我解决这个问题吗?
编辑:
这是SongList的初始化
class SongList
{
public:
char unsortedSongs[100][80];
public:
void displaySortedList();
void sortList();
string rearrange(char[]);
string getSongsForArtist(int*);
};
答案 0 :(得分:4)
这一行:
memcpy(&totalList.unsortedSongs, &songs, sizeof(songs));
应该是:
memcpy(totalList.unsortedSongs, songs, sizeof(songs));
因为songs
和totalList.unsortedSongs
都会decay指向与您引用的参考中的第一个示例类似的指针:
memcpy ( person.name, myname, strlen(myname)+1 );
答案 1 :(得分:1)
http://www.cplusplus.com/reference/cstring/memcpy/
Memcpy期望源和目标变量是指针(void *)
totalList.unsortedSongs是一个指针。
当您编写& totalList.unsortedSongs时,您要求指针的地址。有点像“指针指针”...... 看这里: http://www.cplusplus.com/doc/tutorial/pointers/
答案 2 :(得分:0)
我刚刚编译了你的代码,它运行正常。
但是,我觉得你的初始化列表很奇怪。虽然它有效,但它让我觉得你实际上想要定义一个char [80]数组的数组,而不仅仅是char [80]的数组。
所以我认为您的显示例程可能是错误的,并且您的调试器只是没有向您显示出现问题的真实行,因为优化或诸如此类的。