我无法从下面的代码行中找到如何删除上述警告。 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
答案 0 :(得分:6)
引用C11
,章节§6.5.3.2:
一元
*
运算符表示间接。如果操作数指向函数,则结果为 功能指示符;如果它指向一个对象,结果是一个左值指定 宾语。如果操作数的类型为''指向类型'',则结果的类型为''type''。 如果是 已为指针分配了无效值,一元*
运算符的行为为 未定义。强>
因此,您的代码会导致undefined behavior。
另外,相关的,从章节§6.2.5:
void
类型包含一组空值; 它是一个不完整的对象类型 无法完成。
因此,指向void
的指针是用于取消引用的无效操作数。
一个可能的实际案例和可能的解决方案
有时,为了制作泛型,我们将某个指针转换为void *
,将其作为参数传递给函数,然后在函数内部根据一些已知信息将其转换回原始类型。根据章节§6.3.2.3,这是完全有效的:
[...]指向 任何对象类型都可以转换为指向void的指针,然后再返回;结果应该 比较等于原始指针。
如果是这种情况,并且您在函数内部取消引用,则可以将指针强制转换为
char *
(see this answer for why char *
is allowed)。