2010-12-09 129 views
0

我寫了這段代碼將文件'vetores'的內容複製到字符矩陣中,但我認爲動態分配存在問題。有人可以幫助我嗎?指向字符指針的指針分配問題

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

int main() 
{ 
    FILE* varquivo; 
    varquivo = fopen("vetores.txt", "r"); 
    char** arqvetores; 
    arqvetores = (char**) malloc(10*sizeof(char*)); 
    cpyarqvetores(arqvetores, varquivo); 
    printf("%s\n", *(arqvetores + 4));//try prints this line 
    freearqvetores(arqvetores); 
    fclose(varquivo); 
    return 0; 
} 

//copy the contents of file 'vetores' to 'arqvetores' 
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); 
     strcpy(*(arqvetores + i), aux); 
    } 
} 

//free the allocated memory 
void freearqvetores(char** arqvetores){ 
    int i, j; 
    int strtam; 
    for(i = 0; i < 9; i++){ 
     strtam = strlen(*(arqvetores + i)); 
     free(*(arqvetores + i)); 
    } 
    free(arqvetores); 
} 

這裏是文件的內容 'vetores':

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

你認爲你有什麼問題?你的代碼有一些問題(幻數,在兩個不同的地方設置大數組的大小,指針算術而不是索引等),但我認爲沒有理由不起作用。你有什麼問題呢? – 2010-12-09 20:05:30

回答

5

您需要爲每一行分配一個額外的字節來保存終止0字節:

*(arqvetores + i) = (char*) malloc(strtam*sizeof(char)); 

*(arqvetores + i) = (char*) malloc((strtam+1)*sizeof(char)); 
+0

爲什麼我需要再分配一個字節? – adriano 2010-12-09 20:18:14