2017-09-06 3 views
0

J'étudie le langage C et les structures de données. Je souhaite obtenir des explications détaillées sur la raison pour laquelle nous ne pouvons pas utiliser des tableaux dynamiques en tant que paramètres de fonctions utilisant des paramètres de tableau statique.Pourquoi ne pouvons-nous pas utiliser des tableaux dynamiques en tant que paramètres de fonctions utilisant des paramètres de tableaux statiques?

#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]' ne correspond pas à 'int **'. E.g 'int ary [] [3]' (alias 'int (* ary) [3]') pointe sur '[int [3]] [int [3]] ...'. 'int ** ary' pointe sur' [int *] [int *] ... '. – BLUEPIXY

+1

Veuillez ne pas ajouter de texte indésirable pour passer le filtre "code principalement". – Chris

+0

Je suis désolé si vous vous sentiez mal. Aujourd'hui, je rencontre Stack Overflow au début et la phrase m'a embarrassé. – Jeong

Répondre

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

Votre fonction attend spécifiquement un pointeur vers un pointeur de nombre entier qui désigne une séquence de nombres entiers 3 ou un tableau de tableaux de nombres entiers 3 éléments, pas seulement un pointeur de pointeur entiers. ary est juste un pointeur sur un pointeur entier. Bien que vous ayez fait votre int ** avoir la même structure que votre int [][3], cela aurait pu être différent et le compilateur ne peut pas le dire car l'allocation de mémoire se produit à l'exécution, donc si vous ne commentez pas le code, il ne compilera probablement pas, et même Si c'est le cas, le comportement sera indéfini.

Malheureusement, vous avez besoin de 2 fonctions pour faire ce que vous voulez:

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

et

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

Le code à l'intérieur de chaque fonction serait le même.

+0

Thx. Votre explication a été très utile pour comprendre ce que je curieux de savoir !! – Jeong

+0

Non. N'oubliez pas d'aimer les réponses que vous trouvez utiles, cela encourage les gens à aider. – savram