c - 这段 C 代码不是在创建悬空指针吗?

标签 c c99

阅读一些代码我遇到了这个

static void initializeX11SBConfig(X11SBConfig* sbConfig) {
    X11SBConfig defX11SBConfig = {
        .sbStyle = SB_STYLE_W32,
        .sbFgColor = RGB(0, 0, 0),
        .sbBgColor = RGB(255, 255, 255),
        .sbOverScroll = FALSE
    };
    defX11SBConfig.sbWidth = GetSystemMetrics(SM_CXVSCROLL);
    *sbConfig = defX11SBConfig;
}

AFAICT defX11SBConfig 是一个自动变量,因此在退出时 sbConfig 将指向堆栈中不再有效的位置。由于这些颜色引用经常在程序的其他地方使用,所以事情应该会很快爆炸。但他们就是不这样做。

我的 C 非常生疏,所以我可能忘记了默认情况下在 hgeap 上分配的初始化结构或其他东西..

还有,这里有什么更好的地方?分配结构?需要在输入时由 sbConfig 打印预分配结构?其他的?

最佳答案

没有。不取局部变量的地址;它的值被复制(到 sbConfig 指针指定的对象)。

这一行:

*sbConfig = defX11SBConfig;

将整个结构值从 defX11SBConfig 复制到 sbConfig 指定的位置。 (您的印象似乎是它将 defX11SBConfig 的地址 存储在非局部指针变量中)。 defX11SBConfig 的地址不会从函数中泄漏;没有悬挂指针。 sbConfig 参数本身未被修改(仅修改它指向的内容)。此外,即使 sbConfig 被修改,它的值也不会泄漏,因为更改不会反射(reflect)给调用者。

在 C 中,如果您从不使用寻址运算符 & 获取局部变量的地址,那么该地址就不会从其包含函数中泄漏。

关于c - 这段 C 代码不是在创建悬空指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376142/

相关文章:

c - 在结构数组中查找值

c++ - SSL_CTX_set_cipher_list() 没有影响

c - 使用 sscanf 将 C 字符串拆分为标记

c - 与 malloc/free 相比,使用 C99 VLA 是个好主意吗?

c - 为什么 fgets 卡在回车\r 上?

c - 下面的代码有什么问题?如何纠正这个问题?

c - 初始化后的数组获得 BAD 值 [at C ]

c++ - 数组指针永远不会出现段错误?

c - C、C99、ANSI C 和 GNU C 之间有什么区别?

c - C 中的链表是反向打印的