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

时间:2015-09-03 12:48:41

标签: 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上分配的初始化结构或者其他东西..

另外,这里有什么好转的? mallocing结构?要求在进入时由sbConfig进行预分配的结构?其他一些?

1 个答案:

答案 0 :(得分:6)

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

这一行:

*sbConfig = defX11SBConfig;

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

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