我读了一些代码
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/