由于在函数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);
}
答案 0 :(得分:4)
g
中的缓冲区将在对g
的调用终止后保留,因为它是在堆上分配的。
f
中的缓冲区是在堆栈上分配的(因为声明时没有使用static
限定符,这会将其放在进程的数据部分中),因此将不再对其进行良好定义当指针超出范围时(例如,函数退出时)尝试通过指针进行访问;返回值将是一个悬空指针。
在编译您的代码时,我收到以下警告:
warning C4172: returning address of local variable or temporary: buffer