2017-02-18 10 views
2

得るこのプログラムの目的は、2次元配列の各配列変数、関数内の2次元配列を初期化し、ポインタを呼び出します。セグメンテーション違反

チャーmass_data_shiftを設定することが今である[9]〜[9]。は 'T'に等しい。全体で100 Tsに等しくなければならない。

これは、この2D配列アドレスを引数としてvoid関数を呼び出すことによって行われます。これをポインタで呼び出すと、ループで初期化されます。ループ内

は、2DアレイがT.

* mass_data [mass_data_counter] [mass_data_counter_two] = 'T' に設定されるべきであるしています。

しかし.....におけるプログラムの結果:* mass_dataを初期化しようとした後

  • (最も頻繁)セグメンテーションフォールト[4] [2]
  • (時々)Aプログラムが正常に実行された後のセグメンテーションフォルト(?)が実行されます。
  • (時には)プログラムが正常に実行されます。

このプログラムは、どこかで境界から書き出しています。セグメンテーションフォールトなしでプログラムを実行させたり、他の間違いを修正したりするのに役立つでしょう。

#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 

void mass_data_define(char (*mass_data)[9][9]){ 

    int mass_data_counter; 
    int mass_data_counter_two = 0; 

    for (mass_data_counter=0;mass_data_counter<9;mass_data_counter++){ 
    do {  
     std::cout << "|Array #1 " << mass_data_counter 
       << " ::: |Array #2 " << mass_data_counter_two 
       << std::endl; 

     *mass_data[mass_data_counter][mass_data_counter_two] = 'T'; 

     std::cout << *mass_data[mass_data_counter][mass_data_counter_two]; 

     mass_data_counter_two++; 
     std::cout << "---------End of Counter 2 Init Code----------" << std::endl; 
    } while (mass_data_counter_two < 9); 

    mass_data_counter_two = 0; 
    } 
} 

int main() 
{ 
    char mass_data_shift[9][9]; 

    mass_data_define(&mass_data_shift); 

    std::cout << "-END-" << std::endl; 

    return 0; 
} 

最終編集:主な原因は下記のszymによって解決されました。空白とiostreamが見つからなかったのを残念に思っていましたが、投稿時に書式設定の問題でした。また、以下のように配列の長さに合わせてループを変更しました。

+1

最大81のスペースしか使用できません。 Nの配列は0..N-1で索引付けされます。あなたの9x9配列が100個の要素を保持していると言えば、配列はN + 1の大きさになると思います。 012を保持しているだけです。 –

+1

0から9までループしているように見えます。あなたの配列は0から8しかサポートしていません。 –

+0

申し訳ありませんが、0〜9ではなく0〜8になるようにループを変更した後も、私はまだセグメント化エラーが発生します。アイデア? –

答えて

1
*mass_data[mass_data_counter][mass_data_counter_two] = 'T'; 

(*mass_data)[mass_data_counter][mass_data_counter_two] = 'T'; 

であるべき当然のことながら、同じ行のために行く:

std::cout << *mass_data[mass_data_counter][mass_data_counter_two] 

しかし、本当にこのポインタ型は、C/C++での参照によって配列を渡す必要はありません。

あなたは代わりに宣言する必要があります。

void mass_data_define(char mass_data[9][9]) { 
    // To read: 
    char z = mass_data[3][6]; 
    // To write: 
    mass_data[2][1] = 'C'; 
} 

// elsewhere 
char my_mass_data[9][9]; 
mass_data_define(my_mass_data); 
+0

ここで '* mass_data [mass_data_counter] [mass_data_counter_two]'とは何ですか?それは指している任意のアドレスですか? –

+0

ああ、私はもはやポインタを使用しないように変更します。しかし、それを* mass_data [mass_data_counter] [mass_data_counter_two] = 'T'から変更してください。 〜(* mass_data)[mass_data_counter] [mass_data_counter_two] = 'T'; は、まだポインタが保持されているときにセグメンテーションフォルトを修正しませんでした。 –

+0

'(* mass_data)[x] [y]'の代わりに '* mass_data [x] [y]'を使用した場合の両方を更新しましたか?私は答えを更新しました。 – szym

0

短い答え:

 (*mass_data)[mass_data_counter][mass_data_counter_two] = 'T'; 
:ここにあなたのコードを1行の修正がそうポインタを使用し続けることが、まだ ないがセグメンテーションフォールトを取得します

長い回答:Create a pointer to two-dimensional arrayを読んでください。

多次元配列にアクセスするためのポインタの詳細については、thisを参照してください。

関連する問題