0

Cでの2次元配列(構造体の)の概念について頭を悩ませようとしています

次の定義があるとします。

typedef struct group group;

struct group {
    int members;
    int neighbours;
    char color;
};

#define NUM_CELLS 10

単一の配列から多次元配列にいくつかのデータをコピーすることになっている次の関数を使用します。

void test_mgroup_arr(group clusters[][NUM_CELLS],group tests[NUM_CELLS], int num_groups) {

    int i;
    int j = 0;

    for (i = 0; i < num_groups; ++i)
        clusters[i][j] = tests[i];
}

これは次のように呼ばれます:

int num_groups = 5;
group clusters[NUM_CELLS][NUM_CELLS];

group tests[NUM_CELLS];
tests[0].members = 101;
tests[0].neighbours = 111;

tests[1].members = 102;
tests[1].neighbours = 112;

tests[2].members = 103;
tests[2].neighbours = 113;

tests[3].members = 104;
tests[3].neighbours = 114;

tests[4] = tests[3];

test_mgroup_arr(clusters, tests, num_groups);

関数内のコードが、テスト配列から多次元配列の適切な場所に 5 つの項目をコピーすることを期待しています。ただし、これは期待どおりに機能せず、場合によっては segfault さえ発生します。

これはどのように正しくないのですか? 構造体を 1 次元配列から 2 次元配列にコピーする正しい方法は何でしょうか?

4

2 に答える 2

1

配列を渡す方法や配列にアクセスする方法に問題はありません。コードは実際には正しく見え、正しい結果が得られます。ノート:

for(i = 0; i < num_groups, ++i)
   clusters[i][j] = tests[i];

次のアドレスを言いましょう:

clusters[0][0] is 0x0047F7EC
clusters[1][0] is 0x0047F864
clusters[2][0] is 0x0047F8DC

sizeof(group) = 0xC * 0xA (num of groups) = 0x78

したがって、ここで数学がうまくいくことがわかります。jは常に==0なので、私は何をしているのでしょうか。clusters+iのアドレスは次のとおりです。

0x0047F7EC for i=0
0x0047F864 for i=1
0x0047F8DC for i=2

まさにあなたが期待するもの。test_mygroup_arrから出ると、clusters [0] [0]、clusters [1] [0]、clusters [2] [0]、clusters [3] [0]、clusters[4][0]の値を取得します。 tests [0]、tests [1]、tests [2]、tests [3]、tests[4]の値にそれぞれ設定します。

それはあなたが正しいことを目指していたものですか?

何が起こっているのかを確認するためにアドレスを印刷してみましたか?あなたが見せていないあなたのコードにもっとありますか?他の何かがあなたのセグメンテーション違反の原因であるかどうか疑問に思います。C99コンパイラを使用していると思いますか?

注:正常に機能したコードのテストは、投稿したものだけでした。

int main()
{
   int num_groups = 5; 
   ...
   test_mgroup_arr(clusters, tests, num_groups); 
   return 0;
}
于 2012-09-27T12:02:57.353 に答える
0

実際に配列をパラメーターとして渡すには、最初の要素にポインターを渡す必要があります。これは、コンパイラーが期待する方法であるため、代わりに

void test_mgroup_arr(group clusters[][NUM_CELLS],group tests[NUM_CELLS], int num_groups) 使用する

void test_mgroup_arr(group (*)[NUM_CELLS],group tests[NUM_CELLS], int num_groups)
于 2012-09-27T11:25:11.287 に答える