2016-11-02 11 views
1

を使用する場合、私はこのセグメンテーション障害:11ワンセグ障害の原因を見つけるために、GDBを用いて動的3Dアレイパラメータ

Program received signal SIGSEGV, Segmentation fault. 
0x00000001000082bf in matchCounters (input=..., size=5, 
    valid_entries=0x100020cd0 <VALID_REGIONS>, nums=0x7fff5fbff460, 
    counters=0x100020588 <VTT for std::__1::basic_ifstream<char, std::__1::char_traits<char> >+8>) at akh70P3.cpp:524 
524  cout << "counters[4][1] = " << counters[4][1] << endl; 

メイン()

double *** all_counters; 
generateCounters(all_counters); 
matchCounters(/*some more parameters here*/ all_counters[0]); 

matchCounters()

を得ますここでカウンタにアクセスすると、セグメント化エラーが発生します。11

void matchCounters(/*some more parameters here*/ double ** counters) { 

    //this causes segmentation fault 11 
    cout << "counters[4][1] = " << counters[4][1] << endl; 
} 
ここでは、カウンタにアクセス

generateCounters()

void generateCounters(double *** all_counters) { 
    all_counters = new double ** [2]; 
    //region counters 
    all_counters[0] = new double * [VALID_REGIONS_SIZE]; 
    //move kind counters 
    all_counters[1] = new double * [VALID_MOVE_TYPES_SIZE]; 
    for(int i = 0; i < VALID_REGIONS_SIZE; i++) { 
     all_counters[0][i] = new double [CATEGORIES]; 
    } 
    for(int i = 0; i < VALID_MOVE_TYPES_SIZE; i++) { 
     all_counters[1][i] = new double [CATEGORIES]; 
    } 
    //this works just fine! why? 
    cout << "all_counters[0][4][1] = " << all_counters[0][4][1] << endl; 

} 
+1

'generateCounters'では、 'all_counters ='の最初の行はその関数の* caller *に何も意味しません。あなたはローカル変数を変更するだけで、最終的には呼び出し元のポインタは変更されません。これには、何百もの重複した質問があります。[** this ** one](http://stackoverflow.com/questions/35330331/trying-to-dynamically-allocate-a-parent-pointer-to- a-child-inside-a-function-is) – WhozCraig

答えて

2
all_counters = new double ** [2]; 

all_countersパラメータがgenerateCounters()に値によって渡されます。

ダイナミックスコープ内に新しい配列を割り当て、generateCounters()という名前の関数「all_counters」に割り当てます。

main()all_countersはまったく影響を受けません。

代わりに値を渡すのではなく、generateCounters()returnに関数で宣言し、変数にmain()を代入する必要があります。

+0

聖なる...たわごと....私は何時間もこれを理解することに取り組んできました。 generateCounters(double ***&all_counters){}も無効にすることはできません。 私は今、実際にそれをテストしています – herteladrian

+1

はい、これも動作します。このアプローチを批判する人もいるかもしれませんが、これは本当に個人的な好みの問題です。 –

+0

ありがとうございます@Sam – herteladrian

2

問題ではなく、あなたが参照することにより、それを渡す必要がありますが、機能generateCounters()内部の配列をインスタンス化されていますが、値によってallCountersを渡しているということであるだけで正常に動作しますまたはポインタによって。あなたはこのように機能を変更する必要があります。

void generateCounters(double **** all_counters) {} 

以上のC++スタイル:

void generateCounters(double ***& all_counters) {} 
+0

ありがとうBugsFree – herteladrian

関連する問題