1

我创建了一个函数来读取文件并将其内容存储在 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));
     }
 }

这段代码有什么问题?

4

3 回答 3

1

除了基本的设计问题。

您需要确保释放与 malloc 相同的地址
printf malloc 为每次调用返回的地址以及您传递给 free 的地址。

比较这两个列表,它应该为您提供错误的起点

于 2010-12-07T20:42:55.373 回答
1

您已经分配arqvetores了一个指向 char in 的单个指向指针的指针main,但是然后在 in 中cpyarqvetores迭代它,就好像它指向 10 个指向 char 的指针一样。

也请#include <string.h>不要投射 . 的返回值malloc

于 2010-12-07T21:00:55.093 回答
0

char***是一种不好的代码气味。一旦你学会了如何摆脱它,你的问题就会神奇地得到回避。

我首先尝试绘制我想要的数据结构以及它们如何相互链接(如果有的话)的图表,然后计算出我需要动态分配哪些位,哪些不需要。

提示1:如果你不知道编译时它们有多大,你只需要动态分配它们。提示 2:您可以在 C++ 中拥有指针数组以及 char 数组。

于 2010-12-07T20:51:08.297 回答