【发布时间】:2020-03-12 13:22:01
【问题描述】:
我正在尝试编写一个函数来从 C 中的单独文件中读取输入,并安排这些数据以供进一步处理。但是,当我尝试将值分配给 int 变量时,我遇到了分段错误。 代码如下所示:
void read_file1 (char *filename, int *numTrees)
{
int tempNum;
char tempStr[1000];
char line;
FILE *filer;
filer = fopen(filename, "r");
fgets(tempStr, 1000, filer);
sscanf(tempStr, "numTrees: %i numLeaves: %i", numTrees, &tempNum);
/*
More Code
*/
}
void read_file2 (char *filename, int *numTrees, int *numLeaves)
{
char tempStr[1000];
char line;
FILE *filer;
filer = fopen(filename, "r");
fgets(tempStr, 1000, filer);
sscanf(tempStr, "numTrees: %i numLeaves: %i", numTrees, numLeaves); //Segmentation fault occurs here
/*
More Code
*/
}
int main()
{
char *filename = "datainput.txt";
int *numTrees, *numLeaves;
read_file2(filename, numTrees, numLeaves);
return 0;
}
两个不同的 read_file 函数旨在以不同的格式排列数据。 read_file1 函数按预期工作,但是当我尝试在 read_file2 中使用基本相同的设置时,我从 sscanf 收到分段错误。问题似乎在于将值分配给 numTrees,因为尝试单独分配值也会触发分段错误。 这很奇怪,因为几乎相同的 read_file1 工作正常。
谁能说出导致错误的问题?
【问题讨论】:
-
您有两个指针,
numTrees和numLeaves,但是 它们指向哪里? 必须使指针指向有效的地方,否则尝试使用它会导致undefined behavior。 -
旁白:始终检查打开文件是否成功。在测试代码中,您可能不会检查来自
malloc的返回值,但fopen并非如此。检查来自sscanf和fgets的返回值总是好的,否则你的代码将在一阵风中崩溃。 -
文件打开成功。正如我所提到的,以完全相同的方式打开文件的 read_file1 可以按预期工作。
-
filer 是被打开文件的id分配给的变量,还有哪些其他需要与文件交互的函数作为输入给出。不确定正式术语。
-
@OddFunction 您声称打开文件成功。你怎么知道的?从无效的 FILE 指针中读取是未定义的行为。 您绝对需要检查
fopen是否失败。不这样做是一个非常常见的问题来源。
标签: c segmentation-fault