包含此函数的代码将编译??
int *f1(void)
{
int x = 10;
return &x;
}
它在我的系统中正在编译,但我看到了对此代码编译失败的解释:"函数f1返回局部变量的地址。由于变量的生命周期在函数返回后结束,因此返回值的任何使用都会产生未定义的行为。"
答案 0 :(得分:5)
它会编译得很好。然而,编译的产品将产生未定义的行为,这意味着任何事情都可能发生。它可以工作,它可以崩溃,它可以召唤粉红色的独角兽在你的电脑前跳舞。它未定义。
修复代码,无论代码是否编译都是错误的代码。
在某些编译器上,它可能会产生警告,您可以配置编译器,以便在出现警告时发出错误。所以可能在某些编译器下有某些设置,甚至可能都没有编译。
答案 1 :(得分:3)
退出函数后,局部变量将过期。添加一个静态关键字,编译器将停止抱怨。变量static int x的内存位置将始终保留。
int *f1(void)
{
static int x = 10;
return &x;
}
答案 2 :(得分:1)
编译将正常工作。但由于它是一个局部变量,它的范围将不再在函数之后。所以无论它引用什么内存你都会在函数返回后进入,但它将作为操作系统的一个空闲点,并且每当内存请求进入操作系统时它将分配给其他变量。所以它会在运行时产生问题而不是编译时间。
答案 3 :(得分:0)
变量 x 的范围是函数 f1 的本地范围。这意味着当 f1 的所有指令都将被执行时, x 将无法访问。
这是一种非常糟糕的做法,会导致未定义的行为,因为 x 变量的地址将不再存在。
如果需要使用函数修改值,可以始终将指针作为参数传递:
void f1(int *val) {
*val = 10;
}