为什么在全局或外部声明结构时会出现段错误?

rel*_*let 5 c++ printf struct extern segmentation-fault

我在头文件中定义了一个结构,如下所示:

#define LC_ERR_LEN 300
typedef struct dLC_ERRMSG {
   short nr;
   short strategy;
   char tx[LC_ERR_LEN];
} LC_ERRMSG;
Run Code Online (Sandbox Code Playgroud)

我在我的代码中使用的是:

LC_ERRMSG err;
char *szError;
szError = strerror(sStatus);
snprintf(err.tx,LC_ERR_LEN," %s - %s",szFilename,szError);
/* do something with our error string */
Run Code Online (Sandbox Code Playgroud)

这样可行.但是,如果我LC_ERRMSG err;全局声明- 即在使用它的函数之外,或者甚至extern LC_ERRMSG err;(这是我的初衷,因为我希望能够在中心位置读出错误状态),snprintf调用的代码段错误.

你能告诉我任何线索吗?

ddd告诉我,当全局声明时,内存被初始化为全零,或者在声明为extern时至少初始化和可读.值szFilename,szError和LC_ERR_LEN都是正确且有意义的.

Ser*_*gey 3

你的链接器可以简单地丢弃它认为没有使用的符号(GNU 链接器就是这样做的)。在这种情况下,您可以将目标文件与该符号显式链接。

使用 C++,您无法控制其他编译单元中定义的全局对象的初始化顺序,无需任何额外的努力(请参阅http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12)。

使用“首次使用时构造”习惯用法,这只是意味着将静态对象包装在函数内。