-1

完整的程序在这里澄清:compilr.com/rayd360/test-songs

struct Album {
  string title;
  string year;
  string track;
  vector<string> tracks;
  vector<string>::iterator trk;
}MyAlbums[40];

cout << "\n list of songs: \n";
for(int i = 0; i < 5; i++){
  cout << *MyAlbums[i].trk << "\n";
}

给我:“bash:第 1 行:232 分段错误”

我需要将曲目列表传递给按字母顺序对它们进行排序然后打印出来的函数。

很感谢任何形式的帮助!

4

3 回答 3

1

for 循环中的行取消引用由 . 返回的迭代器MyAlbums[i].trk。由于迭代器没有分配给任何东西(它的内部指针没有指向任何东西)取消引用它是未定义的行为。这也可能导致分段错误,因为您正在查看不属于您的内存。

为了解决这个问题,我认为你应该从你的类中删除迭代器。相反,在循环中使用一个:

auto begin = MyAlbums.tracks.begin(),
     end   = MyAlbums.tracks.end();

for (auto it = begin; it != end; ++it)
{
    std::cout << *it;
}
于 2013-04-22T00:24:43.990 回答
0
struct Album {
string title;
string year;
string track;


}MyAlbums[40];
vector<Album> tracks;
vector<Album>::iterator trk=tracks.begin();
cout << "\n list of songs: \n";
for(trk;trk!=tracks.end();++trk){
cout << *trk.title << "\n";

假设您已经填充了 MyAlbums。

于 2013-04-22T00:20:28.520 回答
0

有两个问题:

1) MyAlbums[i].trk 未初始化

2)在遍历容器时,确保不要访问索引无效的容器。

(例如: for(int i = 0; i < 5; i++) 在这种情况下是不安全的)。

// C++11
for ( auto track : MyAlbums.tracks )
{
       cout << track << "\n";
}  

// If not C++11
for (vector<string>::Iterator trackItr = MyAlbums.begin(); 
     trackItr != MyAlbums.end(); ++trackItr)
{
     cout << *trackItr << "\n";
}  
于 2013-04-22T00:24:07.983 回答