c语言 - 关于取消引用指针'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

引用 C11,第§6.5.3.2章:

单元*操作员表示间接。如果操作数指向功能,则结果是 功能指定器;如果指向一个对象,结果是指定 目的。如果操作数具有"键入指针"类型,则结果具有"类型"类型。如果 无效的值已分配给指针,Unary *操作员的行为是 未定义。

因此,您的代码会导致不确定的行为。

另外,与第6.2.5章相关,

void类型包括一个空值;这是一种不完整的对象类型 无法完成。

所以, void 的指针是 dereference的无效操作数。


一种可能的实际情况和可能的解决方案

有时,对于制作仿制药,我们将某个指针投入到 void *,将其作为函数传递给一个函数,然后在函数内部,我们根据一些已知信息将其放回原始类型。根据第6.3.2.3章,这是完全有效的:

[...]指向 任何对象类型都可以将其转换为void的指针并再次返回。结果应 比较与原始指针相等。

如果这是您的情况,并且您在功能内部删除,则可以将指针铸造为

  • 其原始类型(或兼容类型(
  • char *(有关为什么允许char *的原因,请参见此答案(

在取消给之前。