自动释放局部变量

时间:2013-09-17 01:41:32

标签: c linux

我调用一个子函数两次,但第二次可以使用前一次调用的值打印局部变量。我在Linux上测试了这个。为什么第二个字符串指向前一个相同的地址?怎么避免呢? 非常感谢。

#include <stdio.h>

int main(){

  second();
  second();
  return 0;
}
int second (){
  char tmp[40];
  printf("%s \n", tmp);
  strcpy (tmp, "set");
  return 0;
}

3 个答案:

答案 0 :(得分:1)

tmp的第二个实例可以与第一个实例具有相同的地址,因为它们的生命周期不重叠。当您访问tmp的第二个实例时,第一个实例不再存在。

正如其他人所指出的,这里的真正问题是您正在访问未初始化的变量,该变量具有未定义的行为。在这种情况下,该未定义行为的表现显然是“您看到不再存在的旧变量的内容”。您可以通过初始化tmp

来解决此问题
int second ()
{
  char tmp[40] = "";
  printf("%s \n", tmp);
  strcpy (tmp, "set");
  return 0;
}

答案 1 :(得分:0)

根据我的理解,您再次重复declare tmp[40],清除其中的数据,以便为什么不尝试char tmp[40] as a global variable?你试图在每次调用函数时附加单词SET吗?

答案 2 :(得分:0)

int second (){
  char tmp[40];
  printf("%s \n", tmp);  // undefined behavior here
  strcpy (tmp, "set");
  return 0;
}

由于这是未定义的行为(读取未初始化的内存),您可能(或可能不)从第一次调用中获得结果。