当且仅当我尝试关闭文件时,我才会收到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;
}
答案 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;
}