2010-12-07 6 views
1

Je crée une fonction pour lire un fichier et stocker son contenu sur une matrice de char. Après stockage, je veux libérer la matrice mais une erreur d'exécution se produit. Pourquoi ça arrive? Voici le code:problème avec l'utilisation de libre

//the error occurr on function "freearqvetores" 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void cpyarqvetores(char*** arqvetores, FILE* varquivo); 
void freearqvetores(char*** arqvetores); 

int main() 
{ 
    FILE* varquivo; 
    varquivo = fopen("vetores.txt", "r"); 
    char*** arqvetores; 
    arqvetores = (char***) malloc(sizeof(char**)); 
    cpyarqvetores(arqvetores, varquivo); 
    printf("%s\n", **(arqvetores + 2));//A test to verify if the function 
//cpyarqvetores works 
    //freearqvetores(arqvetores); 
    //free(arqvetores); 
    fclose(varquivo); 
    return 0; 
} 

void cpyarqvetores(char*** arqvetores, FILE* varquivo){ 
    char aux[440]; 
    int strtam; 
    int i, j; 
    for(i = 0; i < 10; i++){ 
     fgets(aux, 440, varquivo); 
     strtam = strlen(aux); 
     *(arqvetores + i) = (char**) malloc(strtam*sizeof(char*)); 
     if(*(arqvetores + i) == NULL) 
      exit(-1); 
     for(j = 0; j < strtam; j++){ 
      *(*(arqvetores + i) + j) = (char*) malloc(sizeof(char)); 
      if(*(*(arqvetores + i) + j) == NULL) 
       exit(-2); 
     } 
     strcpy(**(arqvetores + i), aux); 
    } 
} 

void freearqvetores(char*** arqvetores){ 
    int i, j; 
    int strtam; 
    for(i = 0; i < 10; i++){ 
     strtam = strlen(**(arqvetores + i)); 
     printf("strtam = %d\n", strtam); 
     for(j = 0; j < strtam; j++){ 
      printf("[%d]\n", j); 
//this line is right? 
      free(*(*(arqvetores + i) + j)); 
     } 
     free(*(arqvetores + i)); 
    } 
} 

Le contenu du fichier "Vecteurs" est:

1a 2a 3n 4n 2a 5a 6z 2z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 
2a 2a 3z 4n 2a 5a 6z 8z 1v 3z 11c 13e 3z 2e 14n 11n 2v 4a 3z 2a 
3a 2a 3v 4n 2a 5a 6z 8a 1v 3a 11c 13e 3z 1e 11z 11n 2v 4a 3z 5a 
4a 2a 3v 4n 2a 5a 6z 8z 1v 3a 13c 13e 3z 1e 14n 11n 2v 3a 3z 5a 
5a 2a 4a 4n 2a 5a 6a 8z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 
6a 2a 3z 4n 2a 5a 6z 8z 6v 3a 11c 13e 3n 1e 14n 11n 2v 5a 3z 5z 
7a 2a 3n 4n 2a 5a 6z 8z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 
8a 2a 3a 4n 2a 5a 6z 8z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 
9v 5a 6z 2n 1a 5z 6a 3z 3v 5a 13c 11a 3a 2e 13z 12e 2z 2a 3z 5a 
1n 4a 7v 5n 2z 4a 7z 8a 1v 8a 12z 11e 3v 1a 12z 14n 2z 2a 6v 5a 

je devais modifier la fonction cpyarqvetores. Voici le code mais quand j'essaye d'imprimer les chaînes d'arqvetores une occurrence d'erreur.

void cpyarqvetores(char*** arqvetores, FILE* varquivo){ 
    char aux[440]; 
    int strtam; 
    int i, j; 
    *arqvetores = (char**) malloc(10*sizeof(char*)); 
    if(*(arqvetores) == NULL) 
     exit(-1); 
    for(i = 0; i < 10; i++){ 
     fgets(aux, 440, varquivo); 
     strtam = strlen(aux); 
     *(*arqvetores + i) = (char*) malloc(strtam*sizeof(char)); 
     if(*(*arqvetores + i) == NULL) 
      exit(-1); 
     strcpy(*(*arqvetores + i), aux); 
    } 
    for(i = 0; i < 10; i++){ 
     printf("%s\n", *(*arqvetores + i)); 
    } 
} 

ce qui ne va pas avec ce code?

+3

Mes yeux! Les googles, ils ne font rien ... – Roddy

+1

assurez-vous de formater votre code correctement, afin que nous puissions le lire! Je l'ai fait cette fois, rappelez-vous juste pour la prochaine fois. –

+0

Peut-être pourriez-vous nous dire quel était le texte de l'erreur et où cela s'est-il produit? – Bill

Répondre

1

Mis à part les problèmes de conception de base.

Vous devez vous assurer que vous libérez la même adresse que vous malloced
printf l'adresse renvoyée par malloc pour chaque appel et l'adresse que vous passez à libre.

Comparez ces deux listes et il devrait vous donner un point de départ pour savoir où vous allez mal

0

char*** est une mauvaise odeur de code. Une fois que vous apprendrez à vous en débarrasser, vos problèmes seront magiquement évités. Je commencerais par essayer de dessiner un diagramme des structures de données que je veux et comment ils se lient les uns aux autres (le cas échéant), puis de déterminer quels sont les bits dont j'ai besoin d'allouer de façon dynamique, et ceux que je 't. Astuce 1: Vous n'avez besoin d'allouer dynamiquement des choses que si vous ne savez pas quelle sera leur taille au moment de la compilation. Hint2: Vous pouvez avoir des tableaux de pointeurs en C++ ainsi que des tableaux de char.

+0

Je ne sais pas précédemment la taille de chaque chaîne dans le fichier. l'addree passé à fonctionner gratuitement est vraiment l'adresse que je veux gratuite. – adriano

+0

Astuce # 3: Votre problème peut être résolu avec juste des pointeurs TEN. – Roddy

1

Vous avez alloué arqvetores comme un pointeur vers un pointeur à pointeur vers un char dans main, mais dans de cpyarqvetores vous itérer dessus comme si son pointage 10 pointeurs à des pointeurs-à-char.

Également s'il vous plaît #include <string.h> et ne pas convertir la valeur de retour de malloc.