我多次调用一个从输入文件中读取数据的函数。在调试模式下一切正常,但是当我尝试从发布模式运行可执行文件时,带有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()调用之外的任何其他地方都不使用这些变量。
答案 0 :(得分:0)
presstankdatabase
应该是指向包含要打开的文件名的字符串的指针。如果fopen()
崩溃,那么该指针可能无效(或NULL)。没有更多代码,就无法进一步调试它。使用VC调试器来查看正在发生的事情......
编辑:
另一个常见原因是文件名字符串突然停止以NULL结尾。
您应该在打开之前添加printf()
调用以打印文件名。它很可能无法产生预期的输出。如果没有,那么你有一种更有趣的内存损坏形式,需要做更多的工作才能清除。
编辑2:
如果printf()
调用显示正确的字符串,那么您的代码中的其他位置可能存在内存损坏,这会损坏C库的某些内部结构。一个常见的原因是超出了malloc()
提供的静态数组或区域的结束(或者那个问题的开头)。