memcpy создает ошибку сегментации

У меня есть следующий код, который принимает несортированный список песен и исполнителей, сортирует и отображает их.

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

person i .    schedule 18.06.2013    source источник
comment
Можете ли вы показать нам, как SongList объявляется и реализуется? Я предполагаю, что unsortedSongs неправильно инициализирован.   -  person Shafik Yaghmour    schedule 18.06.2013
comment
Вы уверены, что вам нужно &songs, а не только songs? (возможно, то же самое для unsortedSongs, но мы этого не знаем...   -  person John3136    schedule 18.06.2013
comment
Я действительно не думаю, что в строке с memcpy есть ошибка сегментации: http://ideone.com/lJKboC.   -  person newbie    schedule 18.06.2013
comment
Хотя ничего из того, что я сказал, не было технически неверным после возвращения к этому, я не вижу, как это решает основную проблему. Либо у вас было несоответствие размера, которое было исправлено при копировании и вставке, либо проблема действительно была в displaySortedList. Похоже, я не могу удалить свой ответ, так как он принят, так что можете ли вы добавить код для displaySortedList.   -  person Shafik Yaghmour    schedule 18.06.2013


Ответы (3)


Эта строка:

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

должно быть:

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

поскольку и songs, и totalList.unsortedSongs будут распадаться до указателей, что аналогично первому примеру в ссылке, которую вы процитировано:

memcpy ( person.name, myname, strlen(myname)+1 );
person Shafik Yaghmour    schedule 18.06.2013
comment
@ 0x499602D2 Извините, я отвлёкся, но обновил ответ. - person Shafik Yaghmour; 18.06.2013
comment
Я не понимаю, почему передача массива в memcpy через унарный оператор & вызывает ошибку сегментации. Вот полное объяснение, почему это должно работай. - person newbie; 18.06.2013

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

Memcpy ожидает, что переменные источника и назначения будут указателями ( void * )

totalList.unsortedSongs — это указатель.

Когда вы пишете &totalList.unsortedSongs, вы запрашиваете адрес указателя. Немного похоже на "указатель на указатель"... См. здесь: http://www.cplusplus.com/doc/tutorial/pointers/

person tim k    schedule 18.06.2013

Я только что скомпилировал ваш код, и он отлично работает.

Однако я нахожу ваш список инициализаторов довольно любопытным. Хотя это работает, это заставляет меня думать, что вы действительно хотите определить массив массива char[80], а не просто массив char[80].

Поэтому я думаю, что ваша процедура отображения может быть неправильной, и ваш отладчик просто не показывает вам настоящую строку, где что-то идет не так, из-за оптимизации или чего-то еще.

person FRob    schedule 18.06.2013