给一个int变量赋值导致C中的分段错误
我试图编写一个函数,从C语言中的一个单独文件中读取一个输入,并整理这些数据以供进一步处理。然而,当我试图给int变量赋值时,我遇到了分段错误。 代码如下所示:给一个int变量赋值导致C中的分段错误,c,segmentation-fault,C,Segmentation Fault,我试图编写一个函数,从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,
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可以正常工作
有人能说出导致错误的原因吗?至少这在您的代码中是错误的一个非常常见的初学者错误:
int *numTrees, *numLeaves; // those pointers are not initialized
read_file2(filename, numTrees, numLeaves);
相反,您希望:
int numTrees, numLeaves;
read_file2(filename, &numTrees, &numLeaves); // provide the pointers
// to the int variables
// numTrees and numLeaves
此外,还必须检查fopen:
filer = fopen(filename, "r");
if (filer == NULL)
{
printf("Fatal erorr, file does not exist\n");
exit(1);
}
如果文件不存在,这将中止程序。在现实世界的程序中,应该进行更复杂的错误处理,但这里至少可以消除从无效文件指针读取的机会。您有两个指针,numTrees和numLeaves,但它们指向哪里?指针必须指向有效的地方,否则尝试使用它将导致错误。旁白:始终检查打开文件是否成功。在测试代码中,您可能不会检查malloc的返回值,但fopen的情况并非如此。检查sscanf和fgets的返回值总是好的,否则你的代码会在一阵风中崩溃。文件打开成功。正如我所提到的,以完全相同的方式打开文件的read_file1按照预期的方式工作。filer是分配给打开文件的id的变量,以及作为输入提供需要与文件交互的其他函数。不确定您声称文件打开成功的正式术语。你怎么知道的?从无效文件指针读取是未定义的行为。您绝对需要检查fopen是否出现故障。不这样做是一个非常普遍的问题来源。事实上,它们确实指向某个地方。应用程序和操作系统可能驻留在一个随机内存位置上。@AndreyBelkin他们指不到任何地方,这是一个比喻。正确的术语是它们未初始化,取消引用未初始化的指针会导致未定义的行为。应用程序和操作系统可能驻留的随机内存位置是不准确的:它们不指向随机位置,而是指向不确定的位置。