静态字符数组与动态字符数组的 C 奇怪行为



我正在按照 rpcgen 教程进行一个小的"远程过程调用"实用程序,其中客户端向服务器发送请求,然后服务器使用数据格式的字符串进行响应。返回字符串是通过使用 strftime(( char 数组并用格式化的时间填充它来创建的。然后字符数组,t或s被分配给*ptr,谁的地址被返回为return(&ptr(。奇怪的是,当我使用静态 char t 时,该函数有效并且我能够接收正确的字符串。但是,如果我在尝试使用返回的字符串时使用非静态字符 s[100],那就是乱码或随机字符和非字符。对于非静态情况,我不会再次写它,那么它为什么要这样做呢?我也不确定函数定义返回值的含义是双指针**,但我实际上返回了一个带有 &ptr 的单指针*。

char **menuitem_1_svc(char *argp, struct svc_req *rqstp)
{
  struct tm *timeptr;
  time_t clock;
  static char *ptr;
  static char err[] = "Invalid Response ";
  char t[100];
  static char s[100];
  clock = time(0);
  timeptr = localtime(&clock);
  //Use static char[] s or char[] t  both seem to work here
  strftime(s,100,"%A, %B %d, %Y - %T",timeptr);
  /*  This block is just an example.  ptr is only assigned to s or t.
  //This works
  ptr =s;
  //This doesn't
  ptr = t;
  */
  return(&ptr);
}

发生这种情况是因为t是非静态的(在堆栈上分配(,这意味着当函数返回时,内存被释放,当你引用该内存时,它可以是任何东西。 此行为是未定义的。

这是一个常见的错误,切勿返回对局部变量的指针或引用。

它适用于static变量,因为这些变量是在全局内存中分配的,而不是在堆栈上分配的。 返回指针和对静态变量的引用虽然有效,但是一种反模式,应避免。

最新更新