allouer la masortingce en C

Je veux allouer une masortingce.

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 tu voulais 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 masortingce en utilisant

 int offset = i * cols + j; // now mat[offset] corresponds to m(i, j) 

pour la commande en rangée majeure et

 int offset = i + rows * j; // not mat[offset] corresponds to m(i, j) 

pour les commandes de colonnes majeures.

L’une de ces deux options est en fait le moyen préféré de manipuler une masortingce en C. C’est que maintenant, la masortingce sera stockée de manière contiguë en mémoire et vous bénéficierez de la localité de référence . Fondamentalement, le cache du processeur sera beaucoup plus heureux avec vous.

Les autres réponses couvraient déjà celles-ci, mais pour être complet, la FAQ comp.lang.c contient une entrée pertinente:

Comment puis-je allouer dynamicment un tableau multidimensionnel?

ce que tu peux faire c’est

 int (*mat)[col]; mat=(int (*)[col])malloc(sizeof(*mat)*row); 

puis utilisez cette nouvelle masortingce en tant que tapis [i] [j]

Que diriez-vous juste:

 int* mat = malloc(rows * columns * sizeof(int)); 

Vous pouvez également utiliser calloc, qui initialisera en outre la masortingce pour zéro. La signature est légèrement différente:

 int *mat = (int *)calloc(rows * cols, sizeof(int)); 

Vous pouvez le réduire à un appel à malloc, mais si vous souhaitez utiliser un style de tableau 2D, vous avez toujours besoin de la boucle for.

 int** masortingx = (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 avez l'idée. Sinon, je restrais avec ce que Jason suggère.

Pour un tableau à N dimensions, vous pouvez faire ceci:

 int *masortingx = malloc(D1 * D2 * .. * Dn * sizeof(int)); // Di = Size of dimension i 

Pour accéder à une cellule de tableau avec la méthode habituelle, vous pouvez procéder comme suit:

 int index = 0; int curmul = 1; int i; int indexes = {I1, I2, ..., In}; // Ii = Index in dimension i for(i = N-1; i >= 0; i--) { index = index + indexes(i) * curmul; curmul = curmul * Di; } 

(Remarque: je n’ai pas testé maintenant, mais cela devrait fonctionner. Traduit de mon code Matlab, mais dans l’index Matlab commence à 1, je peux donc faire une erreur (mais je ne le crois pas))

S’amuser!