2010-12-07 4 views
1

파일을 읽고 그 내용을 char 행렬에 저장하는 함수를 만듭니다. 저장 후에는 행렬을 비우고 싶지만 실행 오류가 발생합니다. 왜 그렇게됩니까? 파일 "vetores"의무료 사용 문제

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

내용입니다 : 다음은 코드입니다

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

내 눈! Google은 아무것도하지 않으며 ... – Roddy

+1

코드를 올바르게 형식화했는지 확인하여 읽을 수 있습니다. 나는 이번에 그것을했다, 단지 다음 시간 동안 기억한다. –

+0

아마 오류의 텍스트가 무엇이고 어디에서 발생했는지 알려줄 수 있습니까? – Bill

답변

1

기본적인 디자인 문제 외에도.


은 각 호출에 대해 malloc에서 반환 한 주소와 무료로 전달한 주소를 할당해야합니다.

이 두 목록을 비교하고 당신에게 당신이

0

char*** 나쁜 코드 냄새 잘못 어디로 가고 있는지에 대한 시작점을 제공해야합니다. 일단 당신이 그걸 없애는 법을 배우면, 당신의 문제는 마술처럼 사라질 것입니다.

필자는 원하는 데이터 구조 다이어그램을 그리기 시작하고 서로 연결하는 방법부터 시작하여 동적으로 할당해야하는 비트와 내가 사용하지 않는 비트를 알아 낸다. '티.

힌트 1 : 컴파일시 얼마나 큰지 모르는 경우 동적으로 할당해야합니다. Hint2 : C++ 및 char 배열의 포인터 배열을 가질 수 있습니다.

+0

이전에 파일의 각 문자열 크기를 알지 못합니다. 무료 주소로 전달 된 addree는 실제로 내가 원하는 무료 주소입니다. – adriano

+0

힌트 # 3 : 문제는 TEN 포인터만으로 해결할 수 있습니다. – Roddy

1

당신은 main에 숯불 단일 포인터에 대한 포인터에 대한 포인터로 arqvetores을 할당했지만, 다음에 cpyarqvetores 당신이 것처럼 반복 10 포인터 - 투 - 포인터 - 투 - 문자 자사 가리키는.

또한 #include <string.h>을 입력하고 malloc의 반환 값을 전송하지 마십시오.