这个C代码是否会编译?

时间:2014-08-23 12:01:17

标签: c

包含此函数的代码将编译??

int *f1(void)
{
   int x = 10;
   return &x;
}

它在我的系统中正在编译,但我看到了对此代码编译失败的解释:"函数f1返回局部变量的地址。由于变量的生命周期在函数返回后结束,因此返回值的任何使用都会产生未定义的行为。"

4 个答案:

答案 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;
}