首页 > 解决方案 > 为什么不出现“Warning C4172 return address of local variable or temporary”错误?

问题描述

这段代码,返回一个局部指针变量。

但是,为什么没有出现“Warning C4172 return address of local variable or temporary”错误呢?

编译器不输出任何错误。

#include<stdio.h>

static const char *test(void){
    const char *a = NULL;
    char b[64] = {0,};
    a = b;
    return a;

}

int main() {
   const char *a;
   a = test();
}

标签: cmemory-management

解决方案


C有两种“错误”(我在这里非常松散地使用术语错误)必须在编译时捕获的错误,编译器有义务发出诊断。在这种情况下,不能创建可执行文件。

例如:

int foo() int
{
    return 24
}

上面的代码片段不是C程序,无法编译。

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

让我们举一个接近你的例子:

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

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

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

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

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


推荐阅读