为什么不会出现“警告C4172返回局部变量或临时地址”错误?

时间:2018-08-22 06:45:04

标签: c memory-management

此代码,返回一个本地指针变量。

但是,为什么不会出现“警告C4172返回本地变量或临时地址”错误?

编译器不会输出任何错误。

<div>
{/* item is object with user's name and its other details on it */}
 {items.map((item, index) => {
  return <div key={index}>
--item object is passed which is error--->>>{item}</div>;
 })}
</div>

1 个答案:

答案 0 :(得分:0)

C中有两种“错误”(我在这里非常宽松地使用 error 一词)。 必须在编译时捕获的错误,并且编译器有义务发出诊断。在这种情况下,将无法创建可执行文件。

例如:

int foo() int
{
    return 24
}

以上代码段不是C程序,无法编译。

另一种是运行时错误。虽然这里有几个,但我将重点介绍未定义的行为。其中某些部分的某些程序具有这样的语义:如果它们被执行,则该程序的行为是不确定的。而且,这里需要注意的重要一点是,该标准说:“不需要诊断”。

让我们举一个与您最接近的例子:

int* foo()
{
    int a;
    return &a;
}

从技术上讲这是合法的。非法是使用指针。例如,如果您的程序在任何时候都这样做:

int* x = foo();
*x = 24;

然后您的程序具有未定义的行为。并且编译器不需要发出任何诊断信息。之所以如此,是因为在实践中,检查UB可能会变得非常困难,不可能或具有极大的性能损失。

另一方面,如果您的程序从不使用foo()中的指针,则一切正常。但是由于返回的指针实际上是无用的,并且很可能是错误,因此大多数编译器尝试检测这种情况并在编译时发出警告。碰巧分析不够深入或复杂,无法检测到您的特定情况下本地地址的返回。