【问题标题】:C curious behavior of static char array vs dynamic char array [duplicate]静态字符数组与动态字符数组的C好奇行为[重复]
【发布时间】:2019-07-06 16:10:08
【问题描述】:

我正在按照 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);
}

【问题讨论】:

    标签: c arrays static char


    【解决方案1】:

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

    这是一个常见的错误,你不应该返回指针或对局部变量的引用。

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

    【讨论】:

    • static 不完全是全局的,而是文件范围的。
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多