Fclose导致C中的seg错误

时间:2013-02-18 16:59:50

标签: 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。

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

内存分配功能

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

3 个答案:

答案 0 :(得分:1)

为了确保,请检查outFilePtr是否为空:

if (outFilePtr) {fclose(outFilePtr); outFilePtr = NULL;}

我总是在关闭文件时执行此操作,并且还将指针设置为NULL以避免尝试关闭同一文件两次(这可能会导致问题)。

但很可能原因是一些内存泄漏或未定义的行为会使事情变得混乱,而段错误只是由fclose()触发。

答案 1 :(得分:1)

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

您的代码段太短,并且错过了太多其他可能很重要的内容...... 什么是字符串和num2;他们的分配有多大;等...

另外,*(num2 + t)的第一个商店被第二个*(num2 + t)覆盖。

另外,看看ARRAYS .... num2 [t]比*(num2 + t)更容易阅读并且做同样的工作。

答案 2 :(得分:1)

除了你可怕的数组访问语法。您忘记复制输入字符串行。 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, " "));
       }

在你的分配代码中你也只分配了5个字节而不是50个。如果你真的只分配了5个字节,那么你就破坏了堆,这通常会导致fclose崩溃。

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