c - 为什么不出现“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();
}
解决方案
C
有两种“错误”(我在这里非常松散地使用术语错误)。必须在编译时捕获的错误,编译器有义务发出诊断。在这种情况下,不能创建可执行文件。
例如:
int foo() int
{
return 24
}
上面的代码片段不是C
程序,无法编译。
另一种是运行时错误。虽然这里有几个,但我将专注于未定义的行为。其中某些部分的某些程序具有语义,因此如果它们被执行,则程序的行为是未定义的。而且,需要注意的是,该标准说:“不需要诊断”。
让我们举一个接近你的例子:
int* foo()
{
int a;
return &a;
}
这在技术上是合法的。使用指针是非法的。例如,如果您的程序在任何时候这样做:
int* x = foo();
*x = 24;
那么你的程序有未定义的行为。并且编译器不需要发出任何诊断。之所以如此,是因为在实践中检查 UB 会变得非常困难、不可能或性能损失很大。
另一方面,如果您的程序从不使用指针,foo()
那么一切都可以。但是由于返回的指针实际上是无用的并且很可能是一个错误,大多数编译器会尝试检测这种情况并在编译时发出警告。碰巧分析不够深入或复杂,无法在您的特定情况下检测本地地址的返回。
推荐阅读
- python - 二维列表仅按第一位排序
- crafter-cms - Crafter 2.5.5:页面中缺少 objectGroudId
- algorithm - 元胞自动机模拟二维云
- python - 我安装了一个名为 Discord 的模块,在使用“import discord”时出现错误:“ModuleNotFoundError: No module named 'discord'”
- mysql - Is SHOW statement in SQL?
- c# - How can I hide browser of Selenium IEDriver?
- javascript - React - 从根 app.js 文件导出不起作用
- azure - 分布式交换操作
- ios - 由于缺少图标,Xcode Build 未提交
- linux - 在 Linux 中创建、锁定和解锁目录