阅读我遇到的一些代码
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进行预分配的结构?其他一些?
答案 0 :(得分:6)
没有。不采用局部变量的地址;它的值被复制(到sbConfig
指针指定的对象)。
这一行:
*sbConfig = defX11SBConfig;
将整个结构值从defX11SBConfig
复制到sbConfig
指定的位置。 (您似乎在印象中,而是将defX11SBConfig的地址存储在非本地指针变量中)。 defX11SBConfig
的地址不会从函数中泄漏;没有悬空指针。 sbConfig
参数本身未被修改(仅指它指向的参数)。此外,即使sbConfig
被修改,其值也不会泄漏,因为更改不会反映给调用者。
在C中,如果您从未使用地址变量运算符&
获取局部变量的地址,则该地址不会从其包含函数中泄漏。