-2

当且仅当我尝试关闭文件时,我才会不断收到段错误:

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

3 回答 3

1

可以肯定的是,检查它outFilePtr不为空:

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

我总是在关闭文件时这样做,并且我还将指针指向 NULL 以避免尝试关闭同一个文件两次(这也可能导致麻烦)。

但最有可能的原因是一些内存泄漏或未定义的行为,这些事情搞砸了,段错误只是由fclose().

于 2013-02-18T17:12:03.700 回答
1

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

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

此外,*(num2 + t) 的第一个存储被第二个 *(num2 + t) 覆盖。

另外,请看一下 ARRAYS.... num2[t] 比 *(num2+t) 更容易阅读并且可以完成相同的工作。

于 2013-02-18T17:12:41.157 回答
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 个字节,那么你破坏了堆,这通常表现为 crashing 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;
}
于 2013-02-18T17:26:15.753 回答