2

Cで整数の動的2次元配列をいくつか作成するプロジェクトがあります。

mallocateArray 関数を作成して、冗長なコードを削減しようとしています。関数なしで動作させることができます。

問題は、ポインターが迷惑になる可能性があることです。何らかの理由で、このメソッドを使用しようとすると、セグ フォールトが発生します。

私が得たものは次のとおりです。

     void mallocateArray(int ***array, int *row, int *col){
     //allocate storage for the array of ints:
         *array = (int**)malloc(*row * sizeof(int *));
         int i;
         for (i = 0; i < *row; i++){
            *array[i] = (int*)malloc(*col * sizeof(int));
         }
     }

これが私の配列の定義方法です:

     int **matrix1,
     int row = 2
     int col = 3

     mallocateArray(&matrix1, &row, &col);

実行すると、セグフォルトが発生します。したがって、現在、私はこの方法を使用せず、冗長性に対処しています。逆参照などによってポインターをいじってみましたが、それを理解できないようです。

皆さんが私を助けてくれることを願っていました。

動作するメインメソッドのコードの例を次に示します。

      result = (int**)malloc(row1 * sizeof(int *));
int i;
for (i = 0; i < row1; i++){
    result[i] = (int*)malloc(col2 * sizeof(int));
}
4

2 に答える 2

6

あなたは近くにいます。いくつかの括弧が欠落しています。この行:

*array[i] = (int*)malloc(*col * sizeof(int));

次のようにする必要があります。

(*array)[i] = malloc(*col * sizeof(int));

これらの操作順序に気をつけてください!不要なキャストも外しました。

値渡しだけの場合、関数の見た目はそれほど複雑ではありませrowcol。例:

void mallocateArray(int ***array, int row, int col)
{
    *array = malloc(row * sizeof(int *));
    for (int i = 0; i < row; i++){
       (*array)[i] = malloc(col * sizeof(int));
    }
}
于 2013-03-13T01:17:55.303 に答える
4

配列の配列を割り当てています。これは楽しいプロのヒントです - 既知の次元の 2 次元配列を 1 次元配列に凝縮できます! (x,y) インデックスを 1 次元インデックスに変換するには、次を使用します。 i = (x + y * cols)

そうすることで、基本的にメモリ ブロックのリストではなく、配列用に 1 つの連続したメモリ スラブを生成できます。上記で説明したように、 malloc(sizeof(int) * row * column) を使用して配列アクセスを公開してみてください。

これにより、列を逆参照する必要性が減り、(小さいながらも) パフォーマンスが向上します。

于 2013-03-13T01:18:29.907 に答える