关于解除引用' void *'指针

时间:2017-06-02 12:22:33

标签: c pointers void-pointers dereference

我无法从下面的代码行中找到如何删除上述警告。 data是void指针,并且作为回调函数的一部分,将在数据指针中接收字符串。因为我有类型的void指针,但编译器仍显示警告。

下面的行显示基本上有两个警告。 1.解除引用' void *'指针 2.获取' void

类型的表达式地址
 service_ind = atoi((const char*)&data[at_response.param[0].start_of_value_index]) ? TRUE:FALSE ;

以下是必填信息

void * data;
AT_PARSER_RESPONSE at_response;

typedef struct
{

/*Other parameters */

AT_PARAM  param[AT_MAX_NUM_PARAM];

}AT_PARSER_RESPONSE

1 个答案:

答案 0 :(得分:6)

引用C11,章节§6.5.3.2:

  

一元*运算符表示间接。如果操作数指向函数,则结果为   功能指示符;如果它指向一个对象,结果是一个左值指定   宾语。如果操作数的类型为''指向类型'',则结果的类型为''type''。 如果是   已为指针分配了无效值,一元*运算符的行为为   未定义。

因此,您的代码会导致undefined behavior

另外,相关的,从章节§6.2.5:

  

void类型包含一组空值; 它是一个不完整的对象类型   无法完成。

因此,指向void 的指针是用于取消引用的无效操作数。

一个可能的实际案例和可能的解决方案

有时,为了制作泛型,我们将某个指针转换为void *,将其作为参数传递给函数,然后在函数内部根据一些已知信息将其转换回原始类型。根据章节§6.3.2.3,这是完全有效的:

  

[...]指向   任何对象类型都可以转换为指向void的指针,然后再返回;结果应该   比较等于原始指针。

如果是这种情况,并且您在函数内部取消引用,则可以将指针强制转换为

在解除引用之前