2013-06-18 4 views
1

У меня есть следующий код, который берет несортированный список песен и исполнителей, сортирует и отображает их.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; 
} 

Я взял код тетсру почти сразу с примера here, поэтому я запутался, почему это не работает. Может ли кто-нибудь помочь мне исправить это?

редактировать:

это инициализация

Список песен Технический райдер
class SongList 
{ 
public: 
    char unsortedSongs[100][80]; 
public: 
    void displaySortedList(); 
    void sortList(); 
    string rearrange(char[]); 
    string getSongsForArtist(int*); 
}; 
+0

Можете ли вы показать нам, как объявлен и реализован «SongList'? Я предполагаю, что 'unsortedSongs' неправильно инициализируется. –

+0

Вы уверены, что вам нужны '& песни', а не только' песни'? (возможно, то же самое для 'unsortedSongs', но мы не знаем, что ... – John3136

+0

Я действительно не думаю, что в строке с memcpy существует ошибка сегментации: [http://ideone.com/lJKboC] (http://ideone.com/lJKboC). – newbie

ответ

4

Эта линия:

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

должно быть:

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

, так как songs и totalList.unsortedSongs будет decay к указателям, который является analogus в первый пример в ссылке вы цитируемая:

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

Не могли бы вы объяснить, почему? Мне любопытно. :) – 0x499602D2

+0

@ 0x499602D2 Aplogies, я был отвлечен, но я обновил ответ. –

+0

Я не понимаю, почему передача массива в memcpy через унарный оператор '&' вызывает ошибку сегментации. [Здесь] (http://stackoverflow.com/questions/2893911/address-of-an-array-address-of-being-ignored-be-gcc) полное объяснение, почему это должно работать. – newbie

0

Я только что собрал свой код и он работает отлично.

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

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

1

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

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

totalList.unsortedSongs является указателем.

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

Смежные вопросы