Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态字符数组与动态字符数组的奇怪行为_C_Arrays_Static_Char - Fatal编程技术网

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

C 静态字符数组与动态字符数组的奇怪行为,c,arrays,static,char,C,Arrays,Static,Char,我正在按照rpcgen教程制作一个小的“远程过程调用”实用程序,其中客户端向服务器发送请求,然后服务器用数据格式的字符串进行响应。 返回字符串是通过使用strftime()char数组并用格式化的时间填充来生成的。然后将字符数组t或s分配给*ptr,其地址返回为返回(&ptr)。 奇怪的是,当我使用静态字符t时,函数工作,并且我能够接收正确的字符串。但是,如果在尝试使用返回的字符串时使用非静态的字符s[100],则会出现乱码、随机字符和非字符。 对于非静态的情况,我不会再写一遍,那它为什么要这样

我正在按照rpcgen教程制作一个小的“远程过程调用”实用程序,其中客户端向服务器发送请求,然后服务器用数据格式的字符串进行响应。 返回字符串是通过使用strftime()char数组并用格式化的时间填充来生成的。然后将字符数组t或s分配给*ptr,其地址返回为返回(&ptr)。 奇怪的是,当我使用静态字符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 \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
是非静态的(在堆栈上分配的),这意味着当函数返回时,内存被释放,并且在引用该内存时,它可以是任何内容。此行为未定义

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


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

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

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


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

静态的
不是完全全局的,而是文件范围的。
静态的
不是完全全局的,而是文件范围的。