Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于取消引用';void*';指针_C_Pointers_Void Pointers_Dereference - Fatal编程技术网

C 关于取消引用';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

我无法找到如何从下面的代码行中删除上述警告。数据是无效指针,作为回调函数的一部分,将在数据指针中接收字符串。因为我已经键入了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章:

一元
*
运算符表示间接寻址。如果操作数指向函数,则结果为 函数指示符;如果它指向一个对象,结果是一个左值,表示 对象如果操作数的类型为“指向类型的指针”,则结果的类型为“类型”如果是 指针指定的值无效,一元
*
运算符的行为无效 未定义。

因此,您的代码导致

第§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:指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针与引用的类型未正确对齐,则行为未定义。否则,当再次转换回时,结果应与原始指针进行比较。当指向对象的指针转换为指向字符类型的指针时,结果将指向对象的最低寻址字节。