给一个int变量赋值导致C中的分段错误

给一个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,

我试图编写一个函数,从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可以正常工作


有人能说出导致错误的原因吗?

至少这在您的代码中是错误的一个非常常见的初学者错误:

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他们指不到任何地方,这是一个比喻。正确的术语是它们未初始化,取消引用未初始化的指针会导致未定义的行为。应用程序和操作系统可能驻留的随机内存位置是不准确的:它们不指向随机位置,而是指向不确定的位置。