文件指针行为?

Vic*_*cky 0 c c++ file

这是参考我之前提出的问题 -

在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();

}
Run Code Online (Sandbox Code Playgroud)

如果File指针声明为global,则它可以工作.但如果它被声明为local,则会导致内存错误(coredump).

跑上:

HP Unix Itanium

aCC编译器(C++编译器)

有人可以解释一下这种行为吗?

编辑:抱歉没有编辑问题.我现在理解printf()/ fprintf()的问题.在我的回答中,我在Windows上使用Dev C++编译器显示了printf()/ fprintf()的结果.但是当我使用aCC编译器在HP Unix上运行它时,它会完全忽略%s并始终正确打印字符串.那么如何让我的架构师在没有向他展示Unix内存故障的情况下更改它呢?

谢谢.

Log*_*ldo 5

假设本地意味着funcxyz()取消注释fpErr1,它会因为你没有打开文件而发生段错误.你不能只NULL在那里使用,你期望数据在哪里?

我建议写funcxyzfpErr1作为参数,如:

funcxyz(FILE *fpErr1) {
   //FILE * fpErr1 = NULL; 
   sprintf (sMsg, "************ CHECKING FOR THE CRASH ************. \n");
   ERR_MSG (fpErr1, sMsg);
   //ERR_MSG (fpErr1, sMsg);
}
Run Code Online (Sandbox Code Playgroud)

然后从main调用它:

 ...
 funcxyz(fpErr);
 ...
Run Code Online (Sandbox Code Playgroud)