C 返回具有多个可能值的字符指针

C 返回具有多个可能值的字符指针,c,pointers,char,C,Pointers,Char,以下函数的目的是检索特定信息 通过调用几个返回gchar*(使用glib进行D-BUS对象解析)的函数。 get_param()将在另一个文件中用于获取和处理这些值 char * get_param(unsigned short ID) { char * value = NULL; if(ID == 0x01) { value = get_revision(); // REV 04.012 } else if(ID ==

以下函数的目的是检索特定信息 通过调用几个返回gchar*(使用glib进行D-BUS对象解析)的函数。 get_param()将在另一个文件中用于获取和处理这些值

 char * get_param(unsigned short ID)
 {
     char * value = NULL;

     if(ID == 0x01)
     {
         value = get_revision(); // REV 04.012
     }
     else if(ID == 0x02)
     {
         value = get_pin(); // 0000
     }
     else if(ID == 0x03)
     {
         value = get_identifier(); // 690012345396789
     }
     else if(ID == 0x04)
     {
         value = get_number(); // 697132101234585233318
     }
     else if(ID == 0x05)
     {
         value = get_manufacturer(); // MANUFACTURER_1
     }
     else {}

     return value;
 }
我在最终的源文件中获得了预期的值,但返回时可能会出现不良行为 没有内存分配的字符*。在这种特定的情况下,数据长度是事先不知道的,所以它是 是否有必要分配更大的尺寸?我应该将我的函数定义为返回void吗 在其参数中键入并包含字符**

编辑:(提供更多信息)

我将以
get\u pin()
函数为例。 此函数返回一个gchar*,该gchar*已通过使用
gchar*output=g_strdup(g_variant\u get_string(myVariant,NULL))
初始化。根据gnome数据表
g\u strdup返回一个新分配的
myVariant副本。

然后,在最后一个函数中,我将数组定义为
char-value[50]
,并使用
value=get_-param(0x01)

对其进行初始化。目前,您正在返回一个指向已分配值的指针,因此没有不好的做法

如果你真的想为这些指针分配内存,你可以这样做:

 ...
 char* returned_value = malloc(sizeof(char) * (strlen(value) + 1));
 strcpy(returned_value, value);
 return return_value;

当然,您应该相信该值实际上包含一个合理长度的
\0

在当今的标准中,您应该像所有*\r函数一样使用外部分配的内存和长度限制。请参阅gethostbyname\u r

所有其他选择都缺乏。如果您每次强制用户取消分配时都进行分配,这会让您感到不舒服。 您可以为每个线程分配和重用相同的内存,但是,在您的情况下,由于您处理的是各种返回值,内存的内容将在您的客户端脚下发生变化,这是非常不明智的


使用外部分配的内存还可以让他们选择以普通malloc以外的其他方式分配内存。

如果返回指针,则无需分配任何内存。指针指向分配的内存。返回指针的函数需要分配内存。这完全取决于您如何使用返回的指针,当然也取决于您调用的函数返回的指针(例如,如果它们返回指向本地非静态数组的指针,则您会遇到麻烦)。如果不知道更多,很难说出任何具体的内容。看起来您很可能返回一个指向静态分配在内存中的字符串文本的指针。在这种情况下你很好。但这只是一个猜测。你必须告诉我们这些getter在做什么。@JoachimPileborg我编辑了这篇文章,以提供关于变量用法的更多信息。感谢您对更新的澄清:
strdup
正在分配内存。你应该在某个时候释放它。您最好在每次调用
get_param
之前释放它。必须有人释放分配的内存。现在你应该使用*\r函数并提供外部分配的内存