静态字符数组与动态字符数组的重要行为[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

我正在按照rpcgen教程制作一个小的“远程继续调用”实用程序,客户端向服务器发送请求,然后服务器以数据格式化字符串进行响应。返回字符串是使用strftime()char数组并使用格式化时间填充它。然后将char数组,t或s分配给* ptr,将whoes地址作为return返回(&ptr)。令人好奇的是,当我使用静态字符时,函数可以工作,我能够收到正确的字符串。但是,如果我在尝试使用返回的字符串时使用非静态字符[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 \0";
  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);
}
c arrays static char
1个回答
5
投票

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

这是一个常见错误,您永远不应该返回指向本地变量的指针或引用。

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

© www.soinside.com 2019 - 2024. All rights reserved.