【发布时间】:2018-08-22 06:45:03
【问题描述】:
这段代码,返回一个局部指针变量。
但是,为什么没有出现“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();
}
【问题讨论】:
-
显然编译器并没有传递 b 是 a 本地的信息。 (b 指向的内存可以动态分配;如果您返回
&a(更改函数签名后),您肯定会收到警告。)顺便说一句,gcc 也不会抱怨。 -
安全网只能伸展到这里……
-
clang 编译器似乎检测到了这个问题:`警告:与返回给调用者的局部变量 'b' 关联的堆栈内存地址`
-
@StoryTeller 我希望优化器完全消除
a。如果优化器可以看到这些东西,编译器也可以通过可接受的努力,至少有一个选项(这样我们就不会降低已知良好程序的编译时间)。 -
@PeterA.Schneider - 另一方面,优化器可以将此程序减少到相当于
return 0;- 因此,如果它返回到它,可能没有任何东西可以诊断。跨度>
标签: c memory-management