我对此代码有不好的感觉

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]否则可能会将其保存在寄存器中

    09-06 10:00