返回局部变量和动态创建的变量的地址

代码 1:

int *g(){
    int *p;
    p=(int *)malloc(sizeof(int));
    *p=10;
    return p;
}

代码 2:

int *g(){
    int p=10;
    return &p;
}

输出:

代码 2 ----> [警告] 函数返回局部变量的地址 [-Wreturn-local-addr] 仍然给出正确的输出(10)

代码 1 ----> 工作正常。没有警告,没有错误。

我有很多问题。

  1. 代码 1 也返回了一个局部变量的地址,那么为什么没有警告呢?

  2. 代码 2 给出了警告,我明白,我正在返回一个局部变量的地址。当函数 g 执行完成时,栈记录被弹出,因此存在悬空指针的情况。尽管如此,当我运行它时,为什么它会给出正确的输出(10)?

  3. 代码 1 没有警告,没有错误。但这是一个好习惯吗?

PS 两种场景的主要功能相同。

int main()
{
    int *v=g();
    printf("%d",*v);
    return 1;
}

回答

  1. 代码 1 不是返回局部变量的地址,而是返回在堆上分配的区域的地址,所以没问题。
  2. 未定义的行为被调用,你偶然得到了结果。
  3. 该函数g有两个问题:
  • 你没有检查malloc()你应该这样做的结果。
  • 铸造结果malloc() 被认为是一种不好的做法。

以上是返回局部变量和动态创建的变量的地址的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>