我调用一个子函数两次,但第二次可以使用前一次调用的值打印局部变量。我在Linux上测试了这个。为什么第二个字符串指向前一个相同的地址?怎么避免呢? 非常感谢。
#include <stdio.h>
int main(){
second();
second();
return 0;
}
int second (){
char tmp[40];
printf("%s \n", tmp);
strcpy (tmp, "set");
return 0;
}
答案 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;
}
由于这是未定义的行为(读取未初始化的内存),您可能(或可能不)从第一次调用中获得结果。