je veux allouer une matrice.
est-ce la seule option:
int** mat = (int**)malloc(rows * sizeof(int*))
for (int index=0;index<row;++index)
{
mat[index] = (int*)malloc(col * sizeof(int));
}
Eh bien, vous ne nous avez pas donné une implémentation complète. Je suppose que vous vouliez dire.
int **mat = (int **)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));
Voici une autre option:
int *mat = (int *)malloc(rows * cols * sizeof(int));
Ensuite, vous simulez la matrice en utilisant
int offset = i * cols + j;
// now mat[offset] corresponds to m(i, j)
pour la commande des lignes principales et
int offset = i + rows * j;
// not mat[offset] corresponds to m(i, j)
pour l'ordre des colonnes principales.
L'une de ces deux options est en fait la manière préférée de gérer une matrice en C. En effet, maintenant la matrice sera stockée de manière contiguë en mémoire et vous bénéficierez de localité de référence . Fondamentalement, le cache du processeur sera beaucoup plus heureux avec vous.
Les autres réponses couvraient déjà ces derniers, mais par souci d'exhaustivité, le comp.lang.c FAQ a une entrée pertinente:
Comment puis-je allouer dynamiquement un tableau multidimensionnel?
ce que tu peux faire c'est
int (*mat)[col];
mat=(int (*)[col])malloc(sizeof(*mat)*row);
puis utilisez cette nouvelle matrice comme mat [i] [j]
Que diriez-vous simplement:
int* mat = malloc(rows * columns * sizeof(int));
Vous pouvez également utiliser calloc, qui initialisera en plus la matrice à zéro pour vous. La signature est légèrement différente:
int *mat = (int *)calloc(rows * cols, sizeof(int));
Vous pouvez le réduire en un seul appel à malloc, mais si vous voulez utiliser un style de tableau 2d, vous avez toujours besoin de la boucle for.
int** matrix = (int*)malloc(rows * cols * sizeof(int) + rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
matrix[i] = matrix + rows * sizeof(int*) + rows * cols * sizeof(int) * i;
}
Non testé, mais vous voyez l'idée. Sinon, je m'en tiendrai à ce que Jason suggère.