我读了一些代码

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在输入时对预先分配的结构进行pinted?其他的?

最佳答案

不。不获取局部变量的地址;它的值被复制(到sbConfig指针指定的对象)。
这一行:

*sbConfig = defX11SBConfig;

将整个结构值从defX11SBConfig复制到sbConfig指定的位置。(您似乎认为它将defX11SBConfig的地址存储在非本地指针变量中)。defX11SBConfig的地址不会从函数中泄漏;没有悬挂指针。sbConfig参数本身没有被修改(只是它指向什么)。此外,即使修改了sbConfig,其值也不会泄漏,因为更改不会反映给调用方。
在C语言中,如果您从未使用address of operator&获取局部变量的地址,则该地址不能从其包含函数中泄漏。

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

10-12 16:11