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から返されるアドレスと、freeに渡すアドレスをprintfでmallocしたのと同じアドレスを解放していることを確認する必要があります。

これらの2つのリストを比較すると、どこが間違っているかについての出発点が得られるはずです。

于 2010-12-07T20:42:55.373 に答える
1

arqvetoreschar in への単一のポインターツーポインターへのポインターとして割り当てましたmainが、 in では、cpyarqvetores10 個のポインターからポインターへのポインターを指しているかのように反復処理します。

また#include <string.h>、 の戻り値をキャストしないでくださいmalloc

于 2010-12-07T21:00:55.093 に答える
0

char***悪いコードの匂いです。それを取り除く方法を学ぶと、あなたの問題は魔法のように回避されます.

まず、必要なデータ構造と、それらが相互にリンクする方法 (存在する場合) の図を描くことから始め、動的に割り当てる必要があるビットと必要でないビットを特定します。

ヒント 1: コンパイル時にどれくらいの大きさになるかわからない場合にのみ、動的に割り当てる必要があります。ヒント 2: C++ ではポインターの配列と char の配列を使用できます。

于 2010-12-07T20:51:08.297 に答える