这是参考我之前提出的问题 -
在C/C++中声明和使用FILE*指针的正确方法是什么?
MyFile.h char sMsg[712] = ""; #define STD_MSG(string) \ fprintf (stderr, string) #define ERR_MSG(fp, string) \ fprintf (fp, "%s\n", string);\ fflush (fp) MyFile.C #include "PdmTestClnt.h" //--------------------------------------------------------------- // ** Global variables //--------------------------------------------------------------- FILE * fpErr = NULL; funcxyz() { //FILE * fpErr1 = NULL; sprintf (sMsg, "************ CHECKING FOR THE CRASH ************. \n"); ERR_MSG (fpErr, sMsg); //ERR_MSG (fpErr1, sMsg); } //======================================================================== // Main //======================================================================== integer main (integer argc, char ** argv) { //FILE * fpErr = NULL; if (!(fpErr = sysFopen (sErrFileName, "a+"))) { sprintf (sMsg,"Error in opening file %s", sErrFileName); STD_MSG (sMsg); } // Log in the error file sprintf (sMsg, "Log into the error file. \n"); ERR_MSG (fpErr, sMsg); funcxyz(); }
如果File指针声明为global,则它可以工作.但如果它被声明为local,则会导致内存错误(coredump).
跑上:
HP Unix Itanium
aCC编译器(C++编译器)
有人可以解释一下这种行为吗?
编辑:抱歉没有编辑问题.我现在理解printf()/ fprintf()的问题.在我的回答中,我在Windows上使用Dev C++编译器显示了printf()/ fprintf()的结果.但是当我使用aCC编译器在HP Unix上运行它时,它会完全忽略%s并始终正确打印字符串.那么如何让我的架构师在没有向他展示Unix内存故障的情况下更改它呢?
谢谢.
假设本地意味着funcxyz()
取消注释fpErr1,它会因为你没有打开文件而发生段错误.你不能只NULL
在那里使用,你期望数据在哪里?
我建议写funcxyz
取fpErr1
作为参数,如:
funcxyz(FILE *fpErr1) { //FILE * fpErr1 = NULL; sprintf (sMsg, "************ CHECKING FOR THE CRASH ************. \n"); ERR_MSG (fpErr1, sMsg); //ERR_MSG (fpErr1, sMsg); }
然后从main调用它:
... funcxyz(fpErr); ...