这是参考我之前提出的问题 -
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内存故障的情况下更改它呢?
谢谢.
假设本地意味着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);
}
Run Code Online (Sandbox Code Playgroud)
然后从main调用它:
...
funcxyz(fpErr);
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |