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

坦率

我正在跟踪rpcgen教程,以制作一个小的“远程过程调用”实用程序,在该实用程序中,客户端将请求发送到服务器,然后服务器以数据格式的字符串进行响应。通过使用strftime() char数组并用格式化的时间填充返回字符串然后将char数组(t或s)分配给* ptr,其地址将作为return(&ptr)返回令人好奇的是,当我使用static char t时,该函数有效,并且能够接收正确的字符串。但是,如果我使用非静态char 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 \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);
}
可以

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

这是一个常见的错误,您永远不要返回指向局部变量的指针或引用。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章