Memcpy导致分段故障

memcpy creates segmentation fault

本文关键字:故障 分段 Memcpy      更新时间:2023-10-16

我有以下代码,它接受未排序的歌曲和艺术家列表,并对它们进行排序和显示。

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;
}

我几乎直接从这里的示例中获取了memcpy的代码,所以我很困惑为什么它不起作用。有人能帮我修一下吗?

编辑:

这是SongList的初始化

class SongList
{
public:
   char unsortedSongs[100][80];
public:
   void displaySortedList();
   void sortList();
   string rearrange(char[]);
   string getSongsForArtist(int*);
};

这一行:

memcpy(&totalList.unsortedSongs, &songs, sizeof(songs));
应:

memcpy(totalList.unsortedSongs, songs, sizeof(songs));

,因为songstotalList.unsortedSongs都将衰减为指针,这与您引用的参考文献中的第一个例子类似:

memcpy ( person.name, myname, strlen(myname)+1 );

http://www.cplusplus.com/reference/cstring/memcpy/

Memcpy期望源变量和目标变量都是指针(void *)

totalList。unsortedSongs是一个指针。

当你写&totalList。unsortedSongs你要求的是指针的地址。有点像"指针指向指针"……在这里看到的:http://www.cplusplus.com/doc/tutorial/pointers/

我刚刚编译了你的代码,它运行良好。

然而,我发现你的初始化列表相当奇怪。当它工作时,它让我认为你实际上想要定义一个char[80]数组的数组,而不仅仅是一个char[80]数组。

所以我认为你的显示例程可能是错误的,你的调试器只是没有显示你真正的行哪里出了问题,因为优化或什么。