Cette déclaration a plusieurs problèmes:
p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a]));
D'abord, malloc
renvoie une void*
. Vous utilisez ce pointeur en utilisant (int (*(*p)[b])[a])
qui génère une valeur et non un type de données. Ce n'est pas une distribution valide, c'est donc une raison pour laquelle le compilateur vous crie dessus. À ce stade, p
n'a pas été initialisé, de sorte que le dé-référencement effectué ici peut bloquer votre programme si cette instruction a été exécutée. Dans votre appel malloc
, vous utilisez sizeof(int (*p)[a])
. L'instruction int (*p)[a]
n'est pas une instruction C valide.
Il semble que vous faites cela un peu plus complexe qu'il doit être. Il y a deux façons de construire un tableau 2D. Vous pouvez construire un tableau en utilisant malloc(a * b * sizeof(int))
comme l'explique Reinderien. Vous pouvez également créer un tableau 1D de pointeurs, chacun pointant vers un tableau de type int
. De votre code, il semble que vous essayez de faire le dernier.
La plus facile de faire ce serait quelque chose comme ceci:
int **p;
... get input from user ...
// Declare an array of int pointers of length b
p = malloc(b * sizeof(int*));
// For each int* in 'p' ...
for (i = 0; i < b; ++i) {
// ... allocate an int array of length 'a' and store a pointer in 'p[i]' ..
p[i] = malloc(a * sizeof(int));
// ... and fill in that array using data from the user
printf("\t\bEnter Column %d\t\n");
for(j = 0; j < a; j++)
scanf("%d", &p[i][j]);
}
utilisant cette méthode de construction d'un tableau 2D vous permet d'utiliser la syntaxe p[x][y]
. Depuis p
est un pointeur à pointeur, p[x]
est un pointeur sur un tableau et p[x][y]
est un élément du tableau pointé à.
Quelles erreurs obtenez-vous? Quel compilateur utilisez-vous? Construisez-vous cela en C ou C++? – bta
N'oubliez pas de 'libérer 'tous les objets auxquels vous avez alloué de la mémoire. – pmg
Comprenez-vous ce qu'est un pointeur? À partir de ce code, on dirait que vous pensez qu'il s'agit d'un tableau, de 'int (* (* p) []) [];' ce qui est complètement faux. – alternative