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