返回具有多个可能值的char指针

时间:2016-02-22 15:51:42

标签: 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 == 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;
 }

我在最终的源文件中得到了预期的值,但是通过返回我可能会得到不好的行为 char *没有内存分配。在这种特定情况下,数据长度不是事先知道的,所以它是 最好根据需要分配更大的尺寸?我应该将我的函数定义为返回void 在其参数中键入并包含char **?

编辑:(提供更多信息)

我将以get_pin()函数为例。 此函数返回已使用gchar * output = g_strdup (g_variant_get_string(myVariant, NULL))初始化的gchar *。根据myVariant的gnome数据表g_strdup returns a newly-allocated副本。 然后,在最后一个函数中,我将数组定义为char value[50]并使用value = get_param(0x01)

初始化它

2 个答案:

答案 0 :(得分:1)

在现今的标准中,你应该使用外部分配的内存和长度限制,就像所有* _r函数一样。请参阅gethostbyname_r。

缺乏所有其他替代方案。如果你每次强迫用户分配哪个不太舒服就分配。 您为每个线程分配和重用相同的内存,但在您的情况下,由于您处理各种返回值,内存的内容将在您的客户脚下发生变化,因此非常不可取。

使用外部分配的内存也为他们提供了以普通malloc以外的其他方式分配内存的选项。

答案 1 :(得分:-1)

目前,您正在返回指向已分配值的指针,因此没有不好的做法。

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

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

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