1

類似の質問:


#include <vector>
#include <iostream>

using namespace std;

int main() {
  vector<vector<int> > vvi;
  vvi.resize(1);
  vvi[0].reserve(1);
  vvi[0][0] = 1;

  vector<int> vi = vvi[0];

  cout << vi[0]; // cout << vvi[0][0]; works

  return 0;
}

これにより、セグ フォールトが発生しますが、その理由はわかりません。

4

1 に答える 1

8
 vvi[0].reserve(1);
 vvi[0][0] = 1;

resizeではなく、が必要ですreserve

動作が定義されていない要素iへのアクセス。影響はありません。i>=v.size()reservecapacitysize

もし私が実際的な側面に入るとしたら、おそらくあなたは課題をやり遂げるかもしれないと推測するかもしれませんvvi[0][0] = 1;(少なくともリリースモードでは)。しかし、実際の主な問題はここにあります

vector<int> vi = vvi[0];

問題は、vvi[0]のサイズが 0 であるため、の容量viに関係なく、 の内部配列サイズが 0 であることです。vvi[0]それはあなたがセグフォルトを取得する場所だと思います

cout << vi[0]; // cout << vvi[0][0]; works

しかし、それはすべて憶測です。あなたの質問に対する正しい答えは、これです

vvi[0].reserve(1);
vvi[0][0] = 1;

にはすでに未定義の動作があり、それ以上の考慮は必要ありません。

于 2013-03-31T17:19:15.607 に答える