阅读一些代码我遇到了这个
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 打印预分配结构?其他的?
最佳答案
没有。不取局部变量的地址;它的值被复制(到 sbConfig
指针指定的对象)。
这一行:
*sbConfig = defX11SBConfig;
将整个结构值从 defX11SBConfig
复制到 sbConfig
指定的位置。 (您的印象似乎是它将 defX11SBConfig 的地址 存储在非局部指针变量中)。 defX11SBConfig
的地址不会从函数中泄漏;没有悬挂指针。 sbConfig
参数本身未被修改(仅修改它指向的内容)。此外,即使 sbConfig
被修改,它的值也不会泄漏,因为更改不会反射(reflect)给调用者。
在 C 中,如果您从不使用寻址运算符 &
获取局部变量的地址,那么该地址就不会从其包含函数中泄漏。
关于c - 这段 C 代码不是在创建悬空指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376142/