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

C 返回局部变量和动态创建的变量的地址,c,pointers,dynamic-memory-allocation,dangling-pointer,C,Pointers,Dynamic Memory Allocation,Dangling Pointer,代码1: 代码2: int *g(){ int *p; p=(int *)malloc(sizeof(int)); *p=10; return p; } 产出: 代码2-->[Warning]函数返回局部变量[-Wreturn local addr]的地址 仍然提供正确的输出(10) 代码1-->可以正常工作。没有警告,没有错误 我有很多问题 代码1还返回一个局部变量的地址,所以为什么没有警告 代码2给出了一个警告,我知道,我正在返回一个局部变量的地址。当函数

代码1:

代码2:

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

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

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

我有很多问题

  • 代码1还返回一个局部变量的地址,所以为什么没有警告

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

  • 代码1工作时没有警告,没有错误。但这是一种好的做法吗

  • 另外,两种情况下的主要功能相同

    int *g(){
        int p=10;
        return &p;
    }
    
  • 代码1不是返回局部变量的地址,而是返回在堆上分配的区域的地址,所以这很好
  • 未定义的行为被调用,您偶然得到了结果
  • 函数
    g
    有两个问题:
    • 您没有检查
      malloc()
      的结果,而您应该这样做
    • malloc()
      的铸造结果

    1)不是地址而是它的值2)它的未定义行为可能无法工作3)如果您不忘在代码1中释放它,那么该变量的存储不是在堆栈中,而是在堆中?非常感谢你为我澄清这个细节。通常,我总是检查malloc的结果,但这是一个测试代码,所以我没有。对于malloc()的结果,这对我来说是全新的信息!在我的大学考试中,我没有输入(int*),我的分数被扣掉了!变量
    p
    本身在堆栈上。堆的地址存储在变量
    p
    中,并返回存储的地址。确定。谢谢你现在说得非常清楚。
    int main()
    {
        int *v=g();
        printf("%d",*v);
        return 1;
    }