gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:27 25 4
gpt4 key购买 nike

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

#define LC_ERR_LEN 300
typedef struct dLC_ERRMSG {
short nr;
short strategy;
char tx[LC_ERR_LEN];
} LC_ERRMSG;

我在我的代码中这样使用:

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

行得通。但是,如果我全局声明 LC_ERRMSG err; - 即在它使用的函数之外,甚至是 extern LC_ERRMSG err;(这是我的初衷,因为我想能够在中央位置读出错误状态),snprintf 调用中的代码段错误。

你能给我一些线索吗?

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

最佳答案

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

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

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

关于c++ - 为什么在全局或外部声明结构时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3158280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com