4 votes

Allouer de la mémoire au char *** en C

Donc, j'ai des difficultés à allouer de la mémoire pour une char *** variable de type. Mon objectif est de créer une matrice de chaînes de caractères et le code dont je dispose actuellement pour l'allocation de mémoire est le suivant :

char ***matrix;

matrix = calloc(n*MAX_STR, sizeof(char**));
for(z = 0; z < n; z++) {
    matrix[z] = calloc(n, sizeof(char*));
    for(i = 0; i < MAX_STR; i++) {
        matrix[z][i] = calloc(MAX_STR, sizeof(char));
    }
}

J'ai réussi à allouer de la mémoire pour un tableau de chaînes de caractères, en utilisant ceci :

char **list;
list = calloc(n, sizeof(char *));
for (j = 0; j < n; j++){
list[j] = calloc(MAX_STR, sizeof(char));
}

mais j'ai maintenant des problèmes avec la matrice.

L'exécution du programme avec --leak-check=full sur Valgrind me donne le message suivant :

==5126== Invalid write of size 8
==5126==    at 0x400B9F: createmat (proj.c:100)
==5126==    by 0x401598: main (proj.c:237)
==5126==  Address 0x5210878 is 0 bytes after a block of size 72 alloc'd
==5126==    at 0x4C2ABB4: calloc (vg_replace_malloc.c:593)
==5126==    by 0x400B52: createmat (proj.c:98)
==5126==    by 0x401598: main (proj.c:237)

J'aimerais trouver comment allouer de la mémoire pour cela, car je suis encore un débutant en matière de gestion de la mémoire en C. Toute aide serait appréciée, merci.

EDIT : La matrice est censée stocker n tableaux de chaînes de caractères, qui correspondent aux lignes de l'entrée (elle est lue avec fgets plus tard), et chaque tableau alloue le nombre de mots de la ligne, chaque mot (lire, chaque chaîne) ayant au maximum une valeur de MAX_STR nombre de caractères. n est une variable lue à partir de l'entrée, tandis que MAX_STR est une constante définie dans le programme.

7voto

Grijesh Chauhan Points 28442

Matrice de chaîne de caractères ou de tableau de caractères 3D :

Supposons que vous ayez besoin N matrices, chaque matrice peut stocker R des chaînes de longueur MAX_STR-1 alors vous devez allouer la mémoire de votre boucle comme suit, comme :

char ***matrix;

matrix = calloc(N, sizeof(char**)); 
for(z = 0; z < N; z++) { 
    matrix[z] = calloc(R, sizeof(char*));
    for(i = 0; i < R; i++) {
        matrix[z][i] = calloc(MAX_STR, sizeof(char));
    }
}

Il va créer une matrice comme :

matrix
+-------------------+------------------+-----------------------+
| 0                 | 1                | 2                     |
+-------------------+------------------+-----------------------+        
 |                           |                        |

+--+    +----------+       +--+    +----------+     +--+    +----------+
|0 +---| MAX_STR  |       |0 +---| MAX_STR  |     |0 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|1 +---| MAX_STR  |       |1 +---| MAX_STR  |     |1 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|2 +---| MAX_STR  |       |2 +---| MAX_STR  |*    |2 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|3 +---| MAX_STR  |       |3 +---| MAX_STR  |     |3 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|4 +---| MAX_STR  |       |4 +---| MAX_STR  |     |4 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|5 +---| MAX_STR  |       |5 +---| MAX_STR  |     |5 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|6 +---| MAX_STR  |       |6 +---| MAX_STR  |     |6 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|7 +---| MAX_STR  |       |7 +---| MAX_STR  |     |7 +---| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
 ^        ^ 
 |        |
 |        matrix[z][i]
 matrix[z]

Ici, N = 3, et
R = 8

Son tableau de chars 3D de taille matrix[N][R][MAX_STR]

Supposons que quelqu'un veuille imprimer la chaîne de caractères que j'ai marquée * dans le diagramme, qui est la troisième chaîne dans le deuxième tableau, alors il/elle doit indexer de la manière suivante

printf("%s",matrix[1][2]);

Bien que la réponse soit acceptée, je mets à jour ma réponse pour qu'elle puisse être utile à l'avenir.

5voto

simonc Points 30279

En supposant que vous voulez allouer du stockage pour n tableaux, chacun avec n chaînes de caractères, chacune jusqu'à MAX_STR long, il y a quelques erreurs dans le code

matrix = calloc(n*MAX_STR, sizeof(char**));

devrait être

matrix = calloc(n, sizeof(char**));

y

for(i = 0; i < MAX_STR; i++) {

devrait être

for(i = 0; i < n; i++) {

Un peu plus en détail,

matrix = calloc(n*MAX_STR, sizeof(char**));
for(z = 0; z < n; z++) {

semble erronée. Vous attribuez n*MAX_STR mais n'utilisent que des éléments n d'eux

matrix[z] = calloc(n, sizeof(char*));
for(i = 0; i < MAX_STR; i++) {

est également discutable et est erronée pour n<MAX_STR . (Vous attribuez n éléments, puis écrivez à MAX_STR d'entre eux).

Enfin, selon que l'on considère MAX_STR pour inclure l'espace pour un terminateur nul, vous devrez peut-être modifier

matrix[z][i] = calloc(MAX_STR, sizeof(char));

à

matrix[z][i] = calloc(MAX_STR+1, 1);

2voto

Jay Points 8393

Comme vous l'avez dit, vous avez réussi à créer un tableau de chaînes de caractères en utilisant le code ci-dessous :

char **list;
list = calloc(n, sizeof(char *));
for (j = 0; j < n; j++){
list[j] = calloc(MAX_STR, sizeof(char));
}

Maintenant, vous avez besoin d'un tableau de tableaux de chaînes de caractères, donc ça devrait être :

char ***matrix;

matrix = calloc(n, sizeof(char**)); //This creates space for storing the address of 'n' array of strings 
for(z = 0; z < n; z++) { //This loop creates the 'n' array of strings.
    matrix[z] = calloc(n, sizeof(char*));
    for(i = 0; i < n; i++) {
        matrix[z][i] = calloc(MAX_STR, sizeof(char));
    }
}

Donc, en fait, dans le deuxième code, vous créez simplement un espace pour stocker 'n' listes. J'espère que c'est clair.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X