Fclose导致C中的seg故障

Fclose导致C中的seg故障,c,fault,fclose,C,Fault,Fclose,当且仅当我尝试关闭一个文件时,我会一直出现seg错误: FILE *outFilePtr = fopen(*(argv + 2), "w"); //open file, yes i'm sure it opens fclose(outFilePtr); //sometime later in the program. 程序从头到尾运行,没有flcose()。有什么建议吗 gdb上的错误重定向到这里:假设它是一个声明了所有变量的函数。 gdb还指责strtol,我甚至没有使用它

当且仅当我尝试关闭一个文件时,我会一直出现seg错误:

   FILE *outFilePtr = fopen(*(argv + 2), "w"); //open file, yes i'm sure it opens


   fclose(outFilePtr); //sometime later in the program.
程序从头到尾运行,没有flcose()。有什么建议吗

gdb上的错误重定向到这里:假设它是一个声明了所有变量的函数。 gdb还指责strtol,我甚至没有使用它

 int t;
     char line[50];

          for (t = 0; t < lines; t++){
              fgets(line, 50, filePtr);
             strcpy(*string[t], strtok(line, " "));
              *(num1 + t) = atoi(strtok(NULL, " "));
              *(num2 + t) = atoi(strtok(NULL, " "));
           }
intt;
字符行[50];
对于(t=0;t
内存分配函数

 void dynamicArray(int** num1, int** num2, char*** str, int size)
 { 
     int i = 0;

*(num1) = (int*)malloc(sizeof(int) * size);
*(num2) = (int*)malloc(sizeof(int) * size);

*(str) = (char**)malloc(sizeof(char*) * size);

for( i = 0; i < size; i++){
    *(*(str) + i) = (char*)malloc(sizeof(char) *size);
}

return;
 }
void dynamicArray(整数**num1,整数**num2,字符***str,整数大小)
{ 
int i=0;
*(num1)=(int*)malloc(sizeof(int)*size);
*(num2)=(int*)malloc(sizeof(int)*size);
*(str)=(char**)malloc(sizeof(char*)*size);
对于(i=0;i
为了确保,请检查
出料口PTR
是否不为空:

if (outFilePtr) {fclose(outFilePtr); outFilePtr = NULL;}
我总是在关闭文件时这样做,并且我还将指针指向NULL,以避免尝试关闭同一文件两次(这也可能会造成麻烦)


但最有可能的原因是一些内存泄漏或未定义的行为,这些行为会造成混乱,segfault只是由
fclose()

触发的。我的猜测是,当您到达fclose()时,outFilePtr的值没有被保留

您的代码片段太短,并且遗漏了太多其他可能很重要的内容。。。 什么是字符串和num2;分配多大,;等等

而且,到*(num2+t)的第一个存储被第二个*(num2+t)覆盖


还有,还有,看看数组。。。。num2[t]比*(num2+t)更容易阅读,并且做同样的工作。

除了可怕的数组访问语法。您忘记复制输入字符串行。
strtok
始终指向每行上更改的相同缓冲区

 int t;
 char line[50];

      for (t = 0; t < lines; t++){
          fgets(line, 50, filePtr);
          strings[t] = strdup(strtok(line, " ")));
          num1[t]    = atoi(strtok(NULL, " "));
          num2[t]    = atoi(strtok(NULL, " "));
       }

你漏掉了其间发生的有趣的部分。。从您所展示的来看,不,它不应该崩溃。您能给出MWE(最低工作示例)吗?这里有点离题:为什么所有这些
*(blah+x)
而不是
blah[x]
?需要更多的代码。你能把代码缩减到MWE吗?这种黑盒模型的方法不能帮助我们帮助你。住手,这太烦人了。显式*向有经验的C代码读取器发出信号,表示正在发生“特殊”的事情。因此需要“特别”关注。一个普通的数组下标,虽然在技术上是相同的,但却是完全明显的,不会引起“特别”的注意。希望我的解释不要太奇怪。那么为什么fclose()会触发它呢。错误代码指向atoi错误,但数组都正确填充。。我不明白。在
fclose()
上,标准库向操作系统释放资源。我可以想象,如果某件事情在那一点上出错,你可能会在只读内存上写东西,或者触发其他一些异常(div by zero对我来说似乎不太可能,但仍然可能)。所以很可能,我有一些内存不在它应该在的地方,而程序直到我尝试关闭这个文件才意识到这一点?确实如此。Valgrind或周围的一些
assert()
可能会帮助您找到正确的位置。覆盖部分不适用,这是传输代码时的错误。我不能把整个节目讲得太长。。它怎么会不被保存呢?为什么它会指向这里?最简单的不被保留的方法是因为它被覆盖了——因此我对所有分配进行了查询。尝试添加
printf(“%X\n”,(未签名)outFilePtr)在fopen之后和fclose之前-确保值相同。另一个想法——你不会不止一次失败吧?我不知道那五个人是怎么做到的。抱歉,我的代码中没有这些错误。我的真实代码中有strcpy()。它要么是固定大小的分配,要么是
strcpy
strdup
,但在dynamicArray()中没有特定的分配循环。您的问题看起来像是堆覆盖或双重释放。
void dynamicArray(int** num1, int** num2, char*** str, int size)
{ 
int i = 0;

*num1 = malloc(sizeof(int) * size);
*num2 = malloc(sizeof(int) * size);

*str = malloc(sizeof(char*) * size);

for( i = 0; i < size; i++)
  (*str)[i] = malloc(50);      /* sizeof (char) is by definition 1 */

return;
}