调用后函数销毁

时间:2018-11-09 15:53:04

标签: c gcc

由于在函数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);

}

1 个答案:

答案 0 :(得分:4)

g中的缓冲区将在对g的调用终止后保留,因为它是在堆上分配的。

f中的缓冲区是在堆栈上分配的(因为声明时没有使用static限定符,这会将其放在进程的数据部分中),因此将不再对其进行良好定义当指针超出范围时(例如,函数退出时)尝试通过指针进行访问;返回值将是一个悬空指针。

在编译您的代码时,我收到以下警告:

warning C4172: returning address of local variable or temporary: buffer