【发布时间】:2019-09-14 11:27:40
【问题描述】:
我要做的就是将文件的行读入二维字符数组。我计算了最长行中的行数和字符数(使用函数lineCount())。在我的第一种情况下,它是 500 行,最多 50 个字符。第二种情况是 50,000 行,最多 30 个字符。这是我的main():
int main(int argc, char** argv)
{
char fileName[] = "C:\\valid_50K.txt";
int p[2] = { 0, 0 };
lineCount(&fileName, &p);
uint8_t** lines = (uint8_t**)malloc(sizeof(uint8_t*) * p[0]);
for (int lnVar = 0; lnVar < p[0]; lnVar++)
{
lines[lnVar] = (uint8_t*)malloc(p[1] + 1);
}
readLines(&fileName, p[1], lines);
}
这里是readLines():
void readLines(char* fileName, int numChars, uint8_t** out)
{
FILE *fptr = NULL;
int i = 0;
fptr = fopen(fileName, "r");
while (fgets(out[i], numChars + 1, fptr))
{
out[i][strlen(out[i]) - 1] = '\0';
i++;
}
fclose(fptr);
}
它适用于 500 行,但对于 50K,我在 out[i][strlen(out[i]) - 1] = '\0'; 行上收到错误 Unhandled exception at 0x00007FFAAD21BC78 (ucrtbase.dll) in test.exe: An invalid parameter was passed to a function that considers invalid parameters fatal。整个文件只有1MB,只有ASCII字符,不明白是什么问题。我正在使用 Visual Studio 2017。
【问题讨论】:
-
minimal reproducible example 请。那还不是一个可编译的程序
-
每当我看到一个数组的地址操作符时(如
&fileName和 中的&p),我都认为这是一个危险信号。&fileName的类型是char (*)[18],而不是char *。 -
当然你还需要检查
malloc的返回值。它是否成功分配了这么多内存? -
lineCount(&fileName, &p);可能也有弱点。发布minimal reproducible example -
一定要告诉我们
lineCount。并且总是检查malloc的返回值。 (这只是一个铁定的规则。即使您分配 1 个字节并且它“不可能失败”。即使在您将运行一次并丢弃的测试程序中。总是 检查malloc的返回值。)
标签: c file multidimensional-array