【发布时间】:2018-11-09 15:53:03
【问题描述】:
因为在函数 f 中,缓冲区引用是否可能丢失?我知道该函数在调用后被销毁,但是如果内存地址保持不变,为什么该内容会丢失?另一个细节,因为这是一个不确定的行为。在函数g中,使用strcpy时,内容不会丢失。我想了解编译器做了什么,想在汇编中对其进行采样。谢天谢地。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *f(void) {
char buffer[7] = "blabla";
char *ptr = buffer;
return ptr;
}
char *g(void) {
char *pt = malloc(20);
char str[7] = "blabla";
strcpy(pt,str);
return pt;
}
void main(void) {
char *s1 = f();
puts(s1);
char *s2 = g();
puts(s2);
}
【问题讨论】:
-
“功能被破坏”是什么意思? “不确定的行为”== 未定义的行为。
-
编译器是否不会警告您返回一个指向局部变量的指针(在函数返回后不会继续存在)?
-
这是一个 C++ 问题的答案,但同样的概念也适用.. 读起来很有趣:):stackoverflow.com/a/6445794/3476780
-
阅读一下“自动”变量...
-
为了您自己的利益,配置 gcc 以报告所有警告并将它们报告为错误 (
-Wall -Werror)。你的编译器足够聪明prevent you from even running this。