2012-08-03 7 views
6

私はC++、特にSTLをかなり新しくしています。関数に引数としてベクトルを渡そうとしていますが、アプリケーションがクラッシュする原因になります。私はCode :: BlocksとMingWを使用しています。ここに簡単なコードがあります。ベクトルを引数として渡して使用すると、なぜクラッシュするのですか?

#include <iostream> 
#include <vector> 

using namespace std; 

void foo(const vector<int> &v) 
{ 
    cout << v[0]; 
} 
int main(){ 
    vector<int> v; 
    v[0] = 25; 
    foo(v); 
return 0; 
} 

ありがとう!

答えて

6

v[0]というベクトルの最後を超えて書き込むため、クラッシュします。これは未定義の動作です。あなたが何もしなければ、その初期サイズは0です。 (その後も同じことを読んでいますが、その時点までにすべての賭けが外れています)。

おそらくやってみたかった:

vector<int> v; 
v.push_back(25); 
foo(v); 

または多分:

vector<int> v(1); 
v.at(0) = 25; 
foo(v); 

あなたの代わりに[]演算子のv.at(n)を使用している場合ではなく、未定義の動作よりもスローされた例外を取得します。

+0

ありがとうございます!私はSTLについてもっと学ぶべきです。私は明らかに間違っている単純な配列としてベクトルを扱います! – Physer

+0

@Physer - ベクトルは非常に多くの点で配列に似ています。ベクトルの終わりを過ぎて読み取ることは、配列の最後を読み取ることより良く/悪いことではありません。 – Flexo

+0

私はあなたが何を意味するかを見ます。これは私が取り組んでいるより大きいコードの抜粋です。最初は、ベクトルにサイズv(100)を与え、v [i] = valueのようなループを使ってそれを設定しました。 ... – Physer

関連する問題