返回局部变量和动态创建的变量的地址
代码 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 也返回了一个局部变量的地址,那么为什么没有警告呢?
-
代码 2 给出了警告,我明白,我正在返回一个局部变量的地址。当函数 g 执行完成时,栈记录被弹出,因此存在悬空指针的情况。尽管如此,当我运行它时,为什么它会给出正确的输出(10)?
-
代码 1 没有警告,没有错误。但这是一个好习惯吗?
PS 两种场景的主要功能相同。
int main()
{
int *v=g();
printf("%d",*v);
return 1;
}
回答
- 代码 1 不是返回局部变量的地址,而是返回在堆上分配的区域的地址,所以没问题。
- 未定义的行为被调用,你偶然得到了结果。
- 该函数
g有两个问题:
- 你没有检查
malloc()你应该这样做的结果。 - 铸造结果
malloc()被认为是一种不好的做法。