проблема с использованием бесплатных - PullRequest
1 голос
/ 07 декабря 2010

Я создаю функцию для чтения файла и сохранения его содержимого в матрице char.После сохранения я хочу освободить матрицу, но возникает ошибка выполнения.Почему так происходит?Вот код:

//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));
    }
}

Содержимое файла "vetores":

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

Мне пришлось изменить функцию cpyarqvetores.Вот код, но когда я пытаюсь распечатать строки arqvetores, возникает ошибка.

 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));
     }
 }

что не так с этим кодом?

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

Вы выделили arqvetores как указатель на один указатель на указатель на символ в main, но затем в cpyarqvetores вы перебираете его, как если бы он указывал на 10 указателей на указатели -в-символ.

Также, пожалуйста, #include <string.h> и не применяйте возвращаемое значение malloc.

1 голос
/ 07 декабря 2010

Помимо основных проблем проектирования.

Вам необходимо убедиться, что вы освобождаете тот же самый адрес, который вы использовали
printf адрес, возвращаемый malloc для каждого вызова, и адрес, который вы передаете free.

Сравните эти два списка, и это должно дать вам отправную точку, где вы идете не так

0 голосов
/ 07 декабря 2010

char*** - неприятный запах кода.Как только вы научитесь избавляться от этого, ваши проблемы волшебным образом обойдутся стороной.

Я бы начал с попытки нарисовать диаграмму структур данных, которые я хочу, и как они связываются друг с другом (если вообще), а затем определите, какие биты мне нужно динамически распределять, а какие нет.

Подсказка 1. Вам нужно только динамически распределять объекты, если вы не знаете, насколько они будут большими при компиляциивремя.Подсказка 2: Вы можете иметь массивы указателей в C ++, а также массивы char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...