以下功能的目的是检索细节信息 通过调用几个返回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)
答案 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
一个合理的长度。