たぶん私はちょうど混乱物事少しだ..しかし、C++のコードのこの部分を検討してください:あなたが見ることができるようにこのポインタが競合する理由は何ですか?
#include <iostream>
#include <list>
using namespace std;
void printArray(int *arr, int n)
{
for(int i=0; i<n; ++i)
cout << arr[i] << " ";
cout << endl;
}
int main()
{
list<int*> arrays;
int times=20, v[9]={1,2,3,4,5,6,7,8,0};
arrays.push_back(v);
while(times--)
{
int *cur = arrays.front();
arrays.pop_front();
printArray(cur, 9);
int ta[9], tb[9];
for(int i=0; i<9; ++i)
{
ta[i] = *(cur+i)+1;
tb[i] = *(cur+i)-1;
}
arrays.push_back(&ta[0]);
arrays.push_back(&tb[0]);
}
return 0;
}
を、客観的にはデフォルトの配列{1,2、とbegginingにあります3,4,5,6,7,8,0}、store(in times iterations)intポインタのリストにあるこの配列の2つの変種。
したがって、最初の反復では、2つの配列{2,3,4,5,6,7,8,9,1}と{0,2,3, ,5,6,7、-1私はしました
1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 8 9 1
2 3 4 5 6 7 8 9 1
:最初の3 プリントアレイであるということです
今1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 -1
、起こっていただきました!:}リストに保存する必要があるので、最初の3 プリントアレイはする必要があります既に印刷されたtaと各反復における結核と私は本当に、プリントアウトされているもの1)デフォルトの配列、2)最初のta、最初のTAの3) TBであることを知っています。しかし、私は実際にこの動作の理由がわからない、つまり、各反復で新しい配列(以前のものとは独立しています)がtaとtbではありませんか?これが当てはまる場合、私のforは新しい配列の位置の値を割り当てているだけなので、なぜそれらは互いに衝突していますか?
注意。私の推測では、連続した繰り返しでは、配列の割り当てを解除することができ、動作は未定義です。 whileループの外側にそれらを割り当ててみてください – quimnuss
また、3つのintポインターの配列を持たず、それぞれのint配列に3つのポインターがあります。 – quimnuss
それが理にかなっていれば意味があります。そして、私が以前にwhileループの外側に必要な配列の量を割り当てるか、単純にすべての反復で 'int * ta = new int [9] ... 'とすれば、それはうまく動作します。私の推測は、taとtbはwhileループのローカル変数であるため、スコープの終わりまで有効であり、それは反復自体の終わりです。同意しますか? @quimnuss – yat0