web-dev-qa-db-fra.com

allouer une matrice en C

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));
}
14
Idan

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.

27
jason

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?

6
jamesdlin

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]

4
abhay jain

Que diriez-vous simplement:

int* mat = malloc(rows * columns * sizeof(int));
2
Ana Betts

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));
2
Stéphan Kochen

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.

0
Matthew Scharley