如何在C中完全重新分配2D数组?

时间:2019-06-09 01:29:49

标签: c arrays file multidimensional-array realloc

为简洁起见,我想读取一个文件并将其内容存储在一个2D数组中,其中第一维表示该行,第二维表示相应行中的字符。我不知道每一行的行数和列数。

我尝试的代码如下。

P.S .:我知道变量的名称不是很好的XD

FILE *filepointer = fopen(commandlineargument.filtersfile, "r");
int numboflines = 0;
int numbofchars = 0;
char **array = malloc(numboflines + 1);
array[0] = malloc(numbofchars + 1);
char currentchar; 
while(fscanf(filepointer, "%c", &currentchar) != EOF)
{
    if(currentchar != '\n')
    {
        array[numboflines][numbofchars] = currentchar;
        numbofchars++;
        array[numboflines] = realloc(array[numboflines], numbofchars + 1);
    }
    else
    {
        array[numboflines][numbofchars] = '\0';
        numbofchars = 0;
        numboflines++;
        array = realloc(array,  numboflines + 1);
    }
}
array[numboflines] = '\0';
numboflines--;

使用上面的代码,我只能获取array[0][0]的值,并且只有在它向下重新分配两行之前(然后array[0][0]指向null)。我稍后会遇到细分错误。

P.S .:我知道上面的代码只有在最后一行以\n结尾的情况下才能正常工作

所需输出的示例:

文件内容:

>Abcde
fghijk
>Lmno
pq

2D数组值:

array[0][0] = ">"
array[2][1] = "L"

以此类推。

1 个答案:

答案 0 :(得分:3)

您的代码很好,但是有一个遗漏和一个错误:

错误::数组每个元素的存储空间不是字符,而是指向字符的指针,因此此行:

char **array = malloc(numboflines + 1);

应这样重写:

char **array = malloc((numboflines + 1)*(sizeof *array));

省略:在结束一行并重新分配数组之后,必须malloc新分配的数组元素:

numboflines++;
array = realloc(array,  numboflines + 1);

成为:

numboflines++;
array = realloc(array,  (numboflines + 1)*(sizeof *array));
array[numboflines] = malloc(numbofchars + 1);