0

我多次调用从输入文件中读取数据的函数。在调试模式下一切正常,但是当我尝试从发布模式运行可执行文件时,带有 fopen 的行在几次调用后使程序崩溃。我的代码是:来自头文件:

#define presstankdatabase "presst_database.txt"

在功能上:

FILE *fidread;

fidread = fopen(presstankdatabase,"r");
if (fidread==NULL) {
    printf("Failed to open pressurant tank database: %s\n",presstankdatabase);
    return 1;
}

在调试中,我在以 fidread = 开头的行之前和之后插入了注释行,在几次调用后,程序崩溃并收到消息“问题导致程序停止正常工作。请关闭程序。” 显示 fopen 调用之前的注释,但不显示之后的注释。我对 fopen 的理解是它应该返回一个指针或 NULL,但它甚至在进行检查之前就崩溃了。我唯一能想到的就是不知何故我遇到了内存问题,但我不知道这将如何适应 fopen 崩溃。有谁知道可能会发生什么?谢谢!

编辑 1:我增加了三个变量的大小,它们唯一使用的地方(除了在 printf() 调用中)如下所示。

char *constid = (char*)malloc(sizeof(char)*20);

像这样使用:

strcpy(constid,"Propellant");
strcpy(constid,"Propellant tank");
strcpy(constid,"Pressurant tank");

如果变量大小为 20,如上所示,它会崩溃。但如果它们更大(我试过 120 和 100),程序就会运行。除了 fprintf() 或 printf() 调用之外,这些变量不用于任何其他地方。

4

1 回答 1

0

presstankdatabase应该是指向包含要打开的文件名的字符串的指针。如果fopen()崩溃,则该指针可能无效(或 NULL)。如果没有更多代码,就无法进一步调试它。使用 VC 调试器查看发生了什么...

编辑:

另一个常见原因是文件名字符串突然停止以 NULL 结尾。

您应该printf()在打开之前添加一个调用以打印文件名。它很可能无法产生预期的输出。如果没有,那么你有一种更有趣的内存损坏形式,需要更多的工作才能清除。

编辑2:

如果printf()调用显示正确的字符串,那么您的代码中的其他地方可能存在内存损坏,从而破坏了 C 库的某些内部结构。一个常见的原因是超出了静态数组或由malloc().

于 2011-01-12T18:38:32.243 回答