0

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

#include <stdio.h>

int main(){

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

3 回答 3

1

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

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

int second ()
{
  char tmp[40] = "";
  printf("%s \n", tmp);
  strcpy (tmp, "set");
  return 0;
}
于 2013-09-17T01:52:14.190 回答
0

根据我的理解,您只是declare tmp[40]再次重复,清除其内部数据,那您为什么不尝试一下char tmp[40] as a global variable呢?您是否尝试在每次调用函数时附加单词 SET ?

于 2013-09-17T01:47:42.130 回答
0
int second (){
  char tmp[40];
  printf("%s \n", tmp);  // undefined behavior here
  strcpy (tmp, "set");
  return 0;
}

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

于 2013-09-17T01:47:43.507 回答