2013-05-06 4 views
1

Considérez ce morceau de code:Comment passer « pointeur vers un pointeur » à une fonction qui attend « pointeur sur un tableau »

#define MAX 4 
............ 
............ 
int** ptr = (int**)malloc(sizeof(int*)*MAX); 
*ptr = (int*)malloc(sizeof(int)*MAX); 
// Assigned values to the pointer successfully 

Comment foo() peut être appelé avec ptr comme paramètre? prototype de foo() a été déclaré comme ci-dessous:

void foo(int arr[][MAX]); 
+0

paramètres 'foo' semble être nécessaire un autre. – BLUEPIXY

+0

voir http://stackoverflow.com/a/14549030/399317 – Kos

+0

@BLUEPIXY 'foo paramètres semble être nécessaire un autre' Que diable cela signifie BLUEPIXY? –

Répondre

6

Vous ne pouvez pas passer ptr en tant que paramètre à cette fonction foo.

La disposition de mémoire d'un tableau bidimensionnel (tableau de tableaux) est assez différente de celle d'un tableau de pointeurs vers des tableaux. Modifiez la signature de la fonction pour accepter un int** (et probablement aussi des informations de taille) ou définissez ptr comme étant un tableau bidimensionnel de la taille appropriée.

3

Je vais supposer que la fonction foo dans votre exemple veut réellement un tableau 2-D de int, avec MAX colonnes et un nombre non spécifié de lignes. Cela fonctionne en C et C++ en raison de la disposition des lignes en mémoire. Tous les éléments de la ligne N + 1 apparaissent de manière contiguë après tous les éléments de la ligne N.

La syntaxe int arr[][MAX] demande un pointeur vers le premier élément d'un tel tableau 2-D, pas un tableau de pointeurs vers des lignes. Je suppose que vous voulez le tableau 2-D, et pas un tableau de pointeurs.

D'abord, vous devez allouer correctement vos éléments. Vous n'avez pas précisé quelle est la dimension la plus à gauche de arr[][MAX], ou d'où elle vient. Je suppose qu'il est dans la dim variables ici:

int (*ptr)[MAX]; /* pointer first element of an int[][MAX] array */ 

/* Allocate a 2-D array of dim * MAX ints */ 
ptr = (int (*)[MAX]) malloc(dim * MAX * sizeof(int)); 

Ensuite, appeler votre fonction, juste faire foo(ptr) et cela fonctionnera sans erreurs ou des avertissements. Pour rendre votre code plus propre (en particulier si vous utilisez plusieurs de ces baies 2-D), vous pouvez envisager d'entourer le type de pointeur dans un typedef et d'écrire une petite fonction pour allouer ces baies.

typedef int (*int_array_2d)[MAX]; 

int_array_2d alloc_int_array_2d(int dim1) 
{ 
    return (int_array_2d) malloc(dim1 * MAX * sizeof(int)); 
} 

De cette façon, ailleurs dans votre code, vous pouvez dire quelque chose beaucoup plus simple et plus propre:

int_array_2d ptr = alloc_int_array_2d(dim); 

Utilisez le système de type à votre avantage. La syntaxe C et C++ pour le type et le typecast sont moche, et peu familier à la plupart des gens. Ils semblent étranges en raison de la préséance de * vs []. Cependant, si vous le cachez dans un typedef, cela peut vous aider à rester concentré sur ce que vous essayez de faire, plutôt que de comprendre les problèmes de précédence étranges de C/C++ qui surviennent lorsque vous mélangez des tableaux et des pointeurs.

Questions connexes