C 关于取消引用';void*';指针
我无法找到如何从下面的代码行中删除上述警告。数据是无效指针,作为回调函数的一部分,将在数据指针中接收字符串。因为我已经键入了void指针,但编译器仍然显示警告 下面一行基本上显示了两个警告。 1.取消引用“void*”指针 2.获取“void”类型表达式的地址C 关于取消引用';void*';指针,c,pointers,void-pointers,dereference,C,Pointers,Void Pointers,Dereference,我无法找到如何从下面的代码行中删除上述警告。数据是无效指针,作为回调函数的一部分,将在数据指针中接收字符串。因为我已经键入了void指针,但编译器仍然显示警告 下面一行基本上显示了两个警告。 1.取消引用“void*”指针 2.获取“void”类型表达式的地址 service_ind = atoi((const char*)&data[at_response.param[0].start_of_value_index]) ? TRUE:FALSE ; 以下是所需信息 void * d
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
引用
C11
,第§6.5.3.2章:
一元*
运算符表示间接寻址。如果操作数指向函数,则结果为
函数指示符;如果它指向一个对象,结果是一个左值,表示
对象如果操作数的类型为“指向类型的指针”,则结果的类型为“类型”如果是
指针指定的值无效,一元*
运算符的行为无效
未定义。
因此,您的代码导致
第§6.2.5章中的相关内容:
void
类型包含一组空值这是一个不完整的对象类型
无法完成。
因此,指向void
的指针是用于解引用的无效操作数
一个可能的实际案例和可能的解决方案 有时,为了生成泛型,我们将某个指针强制转换为
void*
,将该指针作为参数传递给函数,然后在函数内部根据一些已知信息将其强制转换回原始类型。根据第§6.3.2.3章,这是完全有效的:
[…]指向的指针
任何对象类型都可以转换为指向void并返回的指针;结果将是
比较等于原始指针
如果这是您的情况,并且您正在函数内部解除引用,那么您可以将指针强制转换为
- 其原始类型(或兼容类型)
- 或者一个
()字符*
在取消引用之前。请给出
数据
,at_response
,以及at_response.param[0]
的定义。我在想(还是我的第一杯咖啡)优先级顺序不是你认为的(const char*)和data[at_response.param[0]。启动_值索引]
(也就是说,您可能需要额外的括号),或者您需要在使用[]
之前将数据转换为有效类型,这取决于数据
的实际情况。@CIsForCookies如我所述,它来自C11标准,实际值已售出,但您可以在线获得一些非常准确的草稿版本。:)但是,您可以,在取消引用之前,将指针强制转换为有效类型。这也可能是未定义的行为,例如,如果您从一个char*
开始,将其分配给一个void*
,然后将其强制转换为double*
,并尝试取消引用它。@CIsForCookies--and。我想您的意思是@AndrewHenle--我刚才为您提供了几个链接CisForCookies@CIsForCookies另一方面,对[unsigned]char*
的强制转换除外。Per:指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针与引用的类型未正确对齐,则行为未定义。否则,当再次转换回时,结果应与原始指针进行比较。当指向对象的指针转换为指向字符类型的指针时,结果将指向对象的最低寻址字节。