我无法从下面的代码行中找出上述警告。数据是无效的指针,作为回调函数的一部分将在数据指针中接收字符串。正如我打了空隙指针,但编译器仍显示警告。
基本上有两个警告在下线上出现。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 *
的原因,请参见此答案(
在取消给之前。