我正在跟踪rpcgen教程,以制作一个小的“远程过程调用”实用程序,其中客户端由客户端向服务器发送请求,然后服务器以数据格式的字符串进行响应。 返回字符串是通过使用 strftime() char数组并用格式化的时间填充它来完成的。然后将char数组(t或s)分配给* ptr,其地址以 return(&ptr)返回。 奇怪的是,当我使用静态字符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);
}
答案 0 :(得分:5)
之所以会这样,是因为t
是非静态的(分配在堆栈上),这意味着当函数返回时,内存将被释放,并且当您引用该内存时,它可能是任何东西。此行为是不确定的。
这是一个常见的错误,您永远不要返回指向局部变量的指针或引用。
它适用于static
变量,因为它们是在全局内存中分配的,而不是在堆栈上。虽然可以,但返回指向静态变量的指针和引用是一种反模式,应该避免。