【问题标题】:Assigning a value to an int variable causing segmentation fault in C将值分配给导致 C 中的分段错误的 int 变量
【发布时间】: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


【解决方案1】:

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

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);
}

如果文件不存在,这将中止程序。在现实世界的程序中,应该进行更复杂的错误处理,但至少在这里我们消除了读取无效 FILE 指针的机会。

【讨论】:

  • 实际上,它们确实指向某个地方。到应用程序和操作系统可能驻留的随机内存位置。
  • @AndreyBelkin “他们无处指点”是一个比喻。正确的术语是“它们未初始化”并且取消引用未初始化的指针会导致未定义的行为。并且“在应用程序和操作系统可能驻留的随机内存位置上”是不准确的:它们不指向 随机 位置,而是指向 不确定 位置。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 2021-12-11
  • 2022-01-04
  • 1970-01-01
  • 2020-07-09
  • 2015-08-06
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多