问题描述
代码 1:
ccc
代码 2:
int *g(){
int *p;
p=(int *)malloc(sizeof(int));
*p=10;
return p;
}
输出:
代码 2 ----> [警告] 函数返回局部变量的地址 [-Wreturn-local-addr] 仍然给出正确的输出(10)
我有很多问题。
-
代码 1 也返回了局部变量的地址,为什么没有警告?
-
代码 2 给出警告,我明白,我正在返回一个局部变量的地址。当函数 g 执行完成时,栈记录被弹出,因此存在悬空指针的情况。尽管如此,当我运行它时,为什么它会给出正确的输出(10)?
P.S 两种场景的主要功能相同。
int *g(){
int p=10;
return &p;
}
解决方法
- 代码 1 不是返回局部变量的地址,而是返回在堆上分配的区域的地址,所以没问题。
- 未定义的行为被调用,你偶然得到了结果。
- 函数
g
有两个问题:
- 您没有检查
malloc()
的结果,而您应该这样做。 -
malloc()
is considered as a bad practice 的铸造结果。