2014-01-28 30 views
0

像20小时过去了,我仍然没有manange得到什么问题。C char ****阵列动态分配行为尴尬

首先,有这些参数的主要功能。

char ***matrix; 
    int line, maxCollumn, i, j; 
    int lineData[100]; 

然后我打电话此功能旨在动态地分配我的矩阵,并返回其线条和collumns的号码的功能

PutFirstAndLast(&matrix, &line, &maxCollumn, lineData); 

。 lineData用于存储每条线上有多少物品,因为稍后在函数中我必须用“”填充“空”空格。

我的令人不安的函数具有该头

int PutFirstAndLast(char**** matrixPointer, int *line2, int *maxCollumn2, int *lineArray) 

在这个函数中,我将产生一个所谓的在半延迟方式“阵列”新的矩阵,我将在orded到新的“阵列”分配存储器从文件“in.txt”中放入每个单词。

int PutFirstAndLast(char**** matrixPointer, int *line2, int *maxCollumn2, int  *lineArray) 
{ 
FILE *inputFile; 
char buffer[100], *p; 
char ***array; 
int i, j, collumn, maxCollumn = 0, line = -1; 




inputFile = fopen("in.txt", "r"); 

while (fgets(buffer, 100, inputFile)) 
{ 

    line++; 
    collumn = 0; 


    if (line == 0) 
     array = (char***)malloc(sizeof(char**)); 
    else 
     array = (char***)realloc(array, sizeof(char**)* (line + 1)); 




    p = strtok(buffer, " \n"); 


    while (p) 
    { 

      //taking each word and allocating a space for it 

     if (collumn == 0) 
      array[line] = (char**)malloc(sizeof(char*)); 
     else 
      array[line] = (char**)realloc(array[line], sizeof(char*)* (collumn + 1)); 


     array[line][collumn] = (char*)malloc(sizeof(char)* strlen(p) + 1); 


     strcpy(array[line][collumn], p); 

     collumn++; 
     p = strtok(NULL, " \n"); 
    } 


      // Here i count what is the maximum numbers of items on a line 


    lineArray[line] = collumn; 
    if (collumn > maxCollumn) 
     maxCollumn = collumn; 



} 


    // Here i add "" in the "empty spaces. 
for (i = 0; i < line + 1; i++) 
{ 
    for (j = lineArray[i]; j < maxCollumn; j++) 
    { 
     array[i] = (char**)realloc(array[i], sizeof(char*)* maxCollumn); 
     array[i][j] = (char*)malloc(sizeof(char)* 10); 
     strcpy(array[i][j], ""); 
    } 

} 

fclose(inputFile); 


*matrixPointer = array; 
*maxCollumn2 = maxCollumn; 
*line2 = line; 

return 0; 
} 

问题是,当我来主要和我对项矩阵为此

for (i = 0; i < line + 1; i++) 
{ 
    for (j = 0; j < maxCollumn; j++) 
    { 
     printf("%s", matrix[i][j]); 
     matrix[i][j] = (char*)realloc(matrix, sizeof(char)* 11); 
    } 

} 

[2] [0]有错误“ACCES违反读取位置”。

钻,如果我做

for (i = 0; i < line + 1; i++) 
    { 
     for (j = 0; j < maxCollumn; j++) 
     { 
      printf("%s", matrix[i][j]); 
     // matrix[i][j] = (char*)realloc(matrix, sizeof(char)* 11); 
     } 

    } 

是没有问题的,并从矩阵我所有的话都显示在屏幕上\

我的文字的型号是:

etesta este astru 
de mext pentru bun 
examen multa programare 

通过在“空”空格中添加“”,我指的是:在这样的阵列中加入“”:

etesta este  astru   
de  mext  pentru  bun 
examen multa  programare  
+0

检查失败的'realloc'调用的第一个参数。你不重新分配正确的指针。另外,你应该小心地分配回你重新分配的同一个指针,如果'reallocate'失败怎么办?然后你松开原来的指针。 –

+0

是的,但问题是,我不能figuire在这种情况下什么是propper重新分配?我现在正在检查失败。 –

+1

你不应该重新分配'matrix [i] [j]'而不是'matrix'吗? –

回答

5

您调用realloc功能与matrix指针时,它应该是matrix[i][j]

matrix[i][j] = realloc(matrix[i][j], sizeof(char)* 11); 

或者,如果你想保护自己免遭失败:

char *temp = realloc(matrix[i][j], sizeof(char)* 11); 
if (temp != NULL) 
    matrix[i][j] = temp; 

注:Don't cast the return of malloc (or realloc) in C

+0

+1尖锐的眼睛。我错过了树林。 – WhozCraig

+0

@JoachimPileborg:虽然这是正确的,但是不是针对4星级编程的建议吗? – legends2k

+0

sry mate,vor voteUp我需要15代表,但我会回来的时候,我会长大! 注意:因为我的编译器是基于C++的 –