首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这不是C代码在创建一个悬空指针吗?

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

Stack Overflow用户
提问于 2015-09-03 12:48:40
回答 1查看 65关注 0票数 0

读了一些代码我偶然发现

代码语言:javascript
复制
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点缀?其他的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 12:50:30

不是的。局部变量的地址不被接受;它的值被复制(到sbConfig指针指定的对象)。

这一行:

代码语言:javascript
复制
*sbConfig = defX11SBConfig;

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32376142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档