我对此代码有不好的感觉
widget* GetNewWidget()
{
widget* theWidget = (widget *) malloc(sizeof(widget));
return theWidget;
}
首先,永远不要转换malloc()的结果(我怀疑也不能在C++(?)中使用它。
其次,
theWidget
不会分配到堆栈上吗?如果是这样,在此函数返回后,调用者是否会尝试访问未定义的行为?
有人可以指向解释此问题的权威URL吗?
[更新]我在想这个问题Can a local variable's memory be accessed outside its scope?
最佳答案
总结:这段代码非常好
返回指针就像返回int
一样:返回的行为实际上是创建按位复制。
逐步,代码工作如下:
malloc(sizeof(widget));
在某个地址处分配一个内存块[1],从某个地址开始(我们称它为a),并且其sizeof(widget)
字节长。widget* theWidget = (widget *) malloc(sizeof(widget));
将地址a存储在变量theWidget
中的stack [2]上。如果malloc
在地址0x00001248
处分配了一个块,则theWidget
现在包含值0x00001248
,就好像它是整数一样。return theWidget;
现在使a的值返回,即,将0x00001248
值写入期望返回值的任何位置。绝对不会使用
theWidget
的地址。因此,没有访问指向theWidget
的悬空指针的风险。请注意,如果您的代码为return &theWidget;
,那就会有问题。[1]否则可能会失败,并返回
NULL
[2]否则可能会将其保存在寄存器中