如何在 C 中完全重新分配二维数组?
How can I fully reallocate a 2D array in C?
简而言之,我想读取一个文件并将内容存储在一个二维数组中,其中第一维是指行,第二维是指相应行中的字符。我事先不知道每行的行数和列数。
我试过的代码如下
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", ¤tchar) != EOF)
{
if(currentchar != '\n')
{
array[numboflines][numbofchars] = currentchar;
numbofchars++;
array[numboflines] = realloc(array[numboflines], numbofchars + 1);
}
else
{
array[numboflines][numbofchars] = '[=10=]';
numbofchars = 0;
numboflines++;
array = realloc(array, numboflines + 1);
}
}
array[numboflines] = '[=10=]';
numboflines--;
使用上面的代码,我只能获取 array[0][0]
的值,并且只能在它向下两行重新分配之前获取(然后 array[0][0]
指向 null)。我稍后遇到分段错误。
P.S.: 我知道上面的代码只有在最后一行以 \n
结尾时才能正常工作
所需输出的示例:
文件内容:
>Abcde
fghijk
>Lmno
pq
二维数组值:
array[0][0] = ">"
array[2][1] = "L"
以此类推
你的代码很好,但是有一处遗漏一处错误:
错误:内存space数组的每个元素不是字符,而是指向字符的指针,所以这一行:
char **array = malloc(numboflines + 1);
应该改写为:
char **array = malloc((numboflines + 1)*(sizeof *array));
遗漏:结束一行并重新分配数组后,必须重新分配新的数组元素:
numboflines++;
array = realloc(array, numboflines + 1);
变为:
numboflines++;
array = realloc(array, (numboflines + 1)*(sizeof *array));
array[numboflines] = malloc(numbofchars + 1);
简而言之,我想读取一个文件并将内容存储在一个二维数组中,其中第一维是指行,第二维是指相应行中的字符。我事先不知道每行的行数和列数。
我试过的代码如下
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", ¤tchar) != EOF)
{
if(currentchar != '\n')
{
array[numboflines][numbofchars] = currentchar;
numbofchars++;
array[numboflines] = realloc(array[numboflines], numbofchars + 1);
}
else
{
array[numboflines][numbofchars] = '[=10=]';
numbofchars = 0;
numboflines++;
array = realloc(array, numboflines + 1);
}
}
array[numboflines] = '[=10=]';
numboflines--;
使用上面的代码,我只能获取 array[0][0]
的值,并且只能在它向下两行重新分配之前获取(然后 array[0][0]
指向 null)。我稍后遇到分段错误。
P.S.: 我知道上面的代码只有在最后一行以 \n
所需输出的示例:
文件内容:
>Abcde
fghijk
>Lmno
pq
二维数组值:
array[0][0] = ">"
array[2][1] = "L"
以此类推
你的代码很好,但是有一处遗漏一处错误:
错误:内存space数组的每个元素不是字符,而是指向字符的指针,所以这一行:
char **array = malloc(numboflines + 1);
应该改写为:
char **array = malloc((numboflines + 1)*(sizeof *array));
遗漏:结束一行并重新分配数组后,必须重新分配新的数组元素:
numboflines++;
array = realloc(array, numboflines + 1);
变为:
numboflines++;
array = realloc(array, (numboflines + 1)*(sizeof *array));
array[numboflines] = malloc(numbofchars + 1);