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

Returning the address of a local variable and dynamically created variable

代码 1:

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

代码 2:

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

输出:

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

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

我有很多问题。

  1. 代码 1 也是返回局部变量的地址,为什么没有警告?

  2. 代码 2 发出警告,据我所知,我正在返回局部变量的地址。当函数 g 执行完成时,堆栈记录被弹出,因此存在悬空指针的情况。不过,当我 运行 它时,为什么它会给出正确的输出 (10)?

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

P.S两种场景的主要功能相同

int main()
{
    int *v=g();
    printf("%d",*v);
    return 1;
}
  1. 代码1不是返回局部变量的地址,而是返回分配在堆上的区域的地址,所以没问题。
  2. 未定义的行为被调用,你得到的结果是偶然的。
  3. 函数g有两个问题:
  • 你没有检查 malloc() 的结果,而你应该这样做。
  • malloc()is considered as a bad practice的选角结果。