C 自动释放局部变量

C 自动释放局部变量,c,linux,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

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

#include <stdio.h>

int main(){

  second();
  second();
  return 0;
}
int second (){
  char tmp[40];
  printf("%s \n", tmp);
  strcpy (tmp, "set");
  return 0;
}
#包括
int main(){
第二个();
第二个();
返回0;
}
整数秒(){
char-tmp[40];
printf(“%s\n”,tmp);
strcpy(tmp,“集”);
返回0;
}

根据我的理解,您刚才再次重复了
声明tmp[40]
,清除了其中的数据,那么为什么不尝试将
字符tmp[40]作为全局变量来执行呢?您是否试图在每次调用函数时都附加单词SET

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

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

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

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

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

它只是碰巧指向相同的数据,因为系统中还没有任何其他内容重写它。为什么需要重置它?在使用它之前,您应该将其设置为所需的值。在我的情况下,我使用sscanf()为字符串赋值,但sscanf(“\n”,“%s”tmp)将不起任何作用,因为字符串只有换行符。然后tmp保持与上一次调用相同的值。“\n”来自一个fgets(),它从文件中读取一个空行。我想我只是在sscanf()之前初始化tmp,因为它可能会失败。解决“问题”的一个方法是创建一个函数
void third(int n){char buffer[40];snprintf(buffer,sizeof(buffer),“%.39d”,n);printf(“buffer:%s\n”,buffer);}
和call
third(391)second()
的两次调用之间的代码>。函数
third()
重用
second()
(ab)使用的相同空间,因此第一次调用
second()
设置的值在第二次调用之前被覆盖。它从来没有可靠的可用性;现在它确实不可用。但是,在
second()
中使用未初始化的变量,如
tmp
,始终是未定义的行为;任何事情都有可能发生,而且是合法的。建议
printf(“>%s