2016-08-24 2 views
-4

Dans le code suivant, lorsque j'essaie de libérer les éléments individuels du tableau 2D de caractères (ie 2dArray [l]), j'ai une erreur (_crtisvalidheappointer (puserdata) dbgheap. c): Une idée sur la raison de l'erreur?Tableau 2d gratuit de char avec realloc

#include<stdio.h> 
int main(){  
    char ** TwodArray= NULL; 
    int k = 0; 
    int j = 0; 

    do{ 
     k++; 
     for (int i= 0; i<10; i++){ 
      j++; 
      TwodArray=(char**)realloc(TwodArray, (j+1)*10*sizeof(char*)); 
      TwodArray[j-1]=(char*)malloc(10 *sizeof(char)); 
      TwodArray[j-1] = "abcdefgh"; 
      .... 
     }   
    }while(k<3) 
    // free the memory 
    for (int l = 0; l < j; l++){ 
     if (TwodArray[l] != NULL) 
      free(TwodArray[l]); // here I get the error! 
    } 
    free(TwodArray); 
    return 0; 
} 
+2

S'il vous plaît nous montrer quelques * Code réel *. –

+0

@JoachimPileborg Le vrai code est complexe et très long, j'ai essayé de le rendre simple ici! Il n'y a pas d'erreur de compilation mais l'erreur d'exécution comme je l'ai mentionné dans le post: '_crtisvalidheappointer (puserdata) dbgheap.c – Homer

+1

Eh bien @Homer le problème est que ce code n'est même pas c. '2dArray' est un nom de paramètre invalide. De toute façon, après avoir réparé les éléments manquants, pour votre faire tout en boucle et le nom du paramètre pour obtenir quelque chose de travail - cet extrait fonctionne. –

Répondre

0
TwodArray[j-1] = "abcdefgh"; 

suivie

free(TwodArray[l]); // with l = j -1 from above 

échouera parce que la valeur de TwodArray[j-1] ne pointe pas à quelque chose attribué par malloc

Avez-vous voulu faire:

strcpy(TwodArray[j-1], "abcdefgh"); 

L'explication est que TwodArray[j-1] = "abcdefgh"; modifie la valeur du pointeur TwodArray[j-1] tandis que strcpy(TwodArray[j-1], "abcdefgh"); copie la chaîne "abcdefgh" à l'emplacement pointé par TwodArray[j-1] (et laisse inchangée la valeur TwodArray[j-1]).

Exemple de code de défaut

#include<stdio.h> 
#include<stdlib.h> 
int main (void) 
{ 
    char* p = malloc(10 * sizeof(char)); 
    printf("%p\n", (void*)p); 
    p = "aaaa";     // Bad.... 
    printf("%p\n", (void*)p); 
    free(p); 
    return 1; 
} 

sortie possible

0x1b76010

0x400688

* Erreur dans `./a.out ': free() : pointeur non valide: 0x0000000000400688 *

Aborted

Exemple de code de travail

#include<stdio.h> 
#include<stdlib.h> 
#include <string.h> 

int main (void) 
{ 
    char* p = malloc(10 * sizeof(char)); 
    printf("%p\n", (void*)p); 
    strcpy(p, "aaaa"); 
    printf("%p\n", (void*)p); 
    printf("%s\n", p); 
    free(p); 
    return 1; 
} 

sortie possible

0x1d2c010

0x1d2c010

AAAA

1

Vous essayez de libérer une chaîne statique.

Si vous écrivez quelque chose comme

char* a = "hello"; 

un ne pointe pas vers une zone de mémoire dynamique. C'est statique, donc vous ne pouvez pas le libérer.

-1

En bref, ne pas les chaînes statiques libres:

char *a = "aaaa"; 
free(a) 

provoquera la même erreur.

Cela fonctionne:

#include <string.h> 
#include <stdlib.h> 
#include<stdio.h> 

int main(){ 
    char ** TwodArray= NULL; 
    int k = 0; 
    int j = 0; 

    do{ 
     k++; 
     for (int i= 0; i<10; i++){ 
      j++; 
      TwodArray=(char**)realloc(TwodArray, (j+1)*10*sizeof(char*)); 
      TwodArray[j-1] = strndup("abcdefgh",8); 
     } 
    }while(k<3); 
    // free the memory 
    for (int l = 0; l < j; l++){ 
     if (TwodArray[l] != NULL) 
      free(TwodArray[l]); // here I get the error! 
    } 
    free(TwodArray); 
    return 0; 
}