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

Isn't this C code creating a dangling pointer?

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

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 的 address 存储在非局部指针变量中)。 defX11SBConfig 的地址不会从函数中泄漏;没有悬挂指针。 sbConfig 参数本身未被修改(仅修改它指向的内容)。此外,即使 sbConfig 被修改,它的值也不会泄漏,因为更改不会反映给调用者。

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