2016-09-23 3 views
0

Je ne suis pas certain de l'origine du problème. Je sais que si je supprime la seconde pour la boucle (où il est censé libérer le tableau interne), cela fonctionne bien.Problème lors de la libération de la mémoire dynamique 2D

int main(void) 
{ 
    int i; 
    char *board = malloc(sizeof(char *) * 8); 
    for (i=0; i<8; i++) 
     board[i] = malloc(sizeof(char *) * 8); 

    for (i=0; i<8; i++) 
     free(board[i]); 
    free(board); 
    return 0; 
} 
+1

L'étiquette a été changée en C, car il s'agit d'un code C droit. – NathanOliver

Répondre

1

La board variable est un pointeur vers char, à savoir un peu comme un string. Cela signifie que chaque "élément" dans board est un caractère unique et non un pointeur.

Cela signifie que lorsque vous dans la boucle ne

board[i] = malloc(sizeof(char *) * 8); 

vous assigner un pointeur à un char, et non un char *.

Vous voulez faire board un pointeur vers pointeurs à char:

char **board = malloc(...) 

Oh, et en passant, vous allouez plus de 8 caractères pour chaque chaîne dans la boucle. Vous allouez de la mémoire à 8 pointeurs. Vous devriez faire par exemple

board[i] = malloc(sizeof(char) * 8); 

Ou, puisque sizeof(char) est toujours égal à 1

board[i] = malloc(8); 

De plus, et je ne sais pas si cela vaut pour vous, mais rappelez-vous que les chaînes en C ont une terminaison spéciale caractère à la fin. Donc, si vous voulez une chaîne de huit caractères, vous devez faire de la place pour neuf caractères.

0

votre variable board est un pointeur à char, mais votre boucle interne alloue la mémoire pour huit pointeurs-à-char, au lieu de huit caractères.

En supposant que votre type de variable board est ce que vous avez vraiment l'intention d'avoir, votre code pour la boucle interne doit se lire comme suit:

for (i=0; i<8; i++) 
     board[i] = malloc(sizeof(char) * 8); 
+0

Encore mieux - 'board [i] = malloc (sizeof * board [i] * 8);' –