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

Abh*_*bhi 3 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 ;
Run Code Online (Sandbox Code Playgroud)

以下是必填信息

void * data;
AT_PARSER_RESPONSE at_response;

typedef struct
{

/*Other parameters */

AT_PARAM  param[AT_MAX_NUM_PARAM];

}AT_PARSER_RESPONSE
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 6

引用C11,第6.5.3.2章:

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

因此,您的代码会导致未定义的行为.

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

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

因此,指针void 一个无效的取消引用操作数.


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

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

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

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

在解除引用之前.