fopen仅在从发布可执行文件运行时崩溃

时间:2011-01-12 18:34:15

标签: visual-c++ visual-c++-2008

我多次调用一个从输入文件中读取数据的函数。在调试模式下一切正常,但是当我尝试从发布模式运行可执行文件时,带有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()调用之外的任何其他地方都不使用这些变量。

1 个答案:

答案 0 :(得分:0)

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

编辑:

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

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

编辑2:

如果printf()调用显示正确的字符串,那么您的代码中的其他位置可能存在内存损坏,这会损坏C库的某些内部结构。一个常见的原因是超出了malloc()提供的静态数组或区域的结束(或者那个问题的开头)。