读了一些代码我偶然发现
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点缀?其他的?
发布于 2015-09-03 12:50:30
不是的。局部变量的地址不被接受;它的值被复制(到sbConfig指针指定的对象)。
这一行:
*sbConfig = defX11SBConfig;将整个结构值从defX11SBConfig复制到sbConfig指定的位置。(您似乎有这样的印象,即它将defX11SBConfig的地址存储在一个非本地指针变量中)。defX11SBConfig的地址不会从函数中泄漏;没有悬空指针。sbConfig参数本身没有被修改(只是它所指向的)。此外,即使修改了sbConfig,它的值也不会泄漏,因为更改不会反映给调用方。
在C中,如果您从未使用address-of运算符&获取局部变量的地址,则该地址不能从其包含的函数中泄漏。
https://stackoverflow.com/questions/32376142
复制相似问题