2017-09-06 10 views
0

私はC言語とデータ構造を研究しています。静的配列パラメータを使用する関数のパラメータとして動的配列を使用できない理由について、詳細な説明をしたいと思います。静的配列パラメータを使用する関数のパラメータとして動的配列を使用できないのはなぜですか?

#include <stdio.h> 

int sumAry2D_f1(int ary[][3], int rows, int cols); 
void freeAry2D(int **ary, int rows); 

int main(void) 
{ 
    int ary2D[][3] = { {1, 2, 3}, {4, 5, 6} }; // static array 

    int r, c; 
    int **ary = (int**)malloc(sizeof(int*) * 2); // dynamic array 
    for (r = 0; r < 2; r++) 
    ary[r] = (int*)malloc(sizeof(int)*3); 

    for (r = 0; r < 2; r++) 
     for (c = 0; c < 3; c++) 
      ary[r][c] = r + c; // 0, 1, 2, 1, 2, 3 

    printf("sumAry2D_f1() %d\n", sumAry2D_f1(ary2D, 2, 3)); 

    // why we can`t function like this? 
    // printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3)); 

    freeAry2D(ary, 2); // free function of dynamic array 

    return 0; 
} 

int sumAry2D_f1(int ary[][3], int rows, int cols) 
{ 
    int i, j, sum = 0; 

    for (i = 0; i < rows; i++) 
     for (j = 0; j < cols; j++) 
      sum += ary[i][j]; 

    return sum; 
} 

void freeAry2D(int **ary, int rows) 
{ 
    int i; 

    for (i = 0; i < rows; i++) 
    free(ary[i]); 
    free(ary); 
} 
+1

'int ary [] [3]'は 'int **'と一致しません。例えば、int [] [3](別名int(* ary)[3] ')は、[int [3]] [int [3]]を指します。 'int ** ary'は' [int *] [int *] ... 'を指します。 – BLUEPIXY

+1

"主にコード"フィルタを通過するために迷惑メールを追加しないでください。 – Chris

+0

あなたが悪いと私はごめんなさい。今日、スタックオーバーフローが発生しました。そのフレーズが私を恥ずかしくしました。 – Jeong

答えて

0
// why we can`t function like this? 
// printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3)); 

あなたの機能具体3つの整数、または3要素、整数配列の配列ではなくポインタを整数にするだけで任意のポインタの配列を指す整数ポインタへのポインタを受け取ります。 aryは整数ポインタへの単なるポインタです。 int **int [][3]と同じ構造になっていましたが、それは異なっている可能性があり、実行時にメモリの割り当てが行われるためコンパイラは指示できません。したがって、コードのコメントを外すと、そうであれば、その動作は未定義になります。

残念ながら、あなたがやりたい2つの機能が必要になります

int sumAry2D_f1(int ary[][3], int rows, int cols); 

int sumAry2D_f12(int** ary, int rows, int cols); 

各関数内のコードが同じになります。

+0

Thx。あなたの説明は、私が興味があることを理解するのに非常に役立ちました! – Jeong

+0

あなたが役に立つと感じる答えを好きになることを忘れないでください。人々の手助けを促します。 – savram

関連する問題