在eclipse中构建下面的代码时,我得到的空值不被忽略,因为它应该是,当我们期望函数返回void的值时,会遇到这个错误。但在这里我没有使用任何函数,我使用的是无效指针。 代码如下:
typedef struct MessageName_T
{
MPM_ParameterName_t parameterName;
uint32_t minRange;
uint32_t maxRange;
bool_t isInRange;
DataType_t dataType;
bool_t isValueNa;
void* const data;
}MessageName_t ;
MessageName_t messagefr[3] =
/* Parameter, Minimum, Maximum, isInRange dataType isValueNa data*/
{
{ Parameter, Minimum, Maximum, isInRange, dataType, isValueNa, &stuctureA.data1},
{ Parameter1, Minimum1, Maximum1, isInRange1, dataType1, isValueNa1, &stuctureA.data2},
{ Parameter2, Minimum2, Maximum2, isInRange2, dataType2, isValueNa2, &stuctureA.data3}
}
void rangecheck(int index)
{
if(messagefr[index].isValueNa == FALSE)
{
if(*(messagefr[index].data) >= (messagefr[index].minRange) &&
*(messagefr[index].data) <= (messagefr[index].maxRange))
{printf("N");
messagefr[index].messagefr=TRUE;
}
else
{printf("Y");
messagefr[index].isInRange =FALSE;
}
}
else
{
NOP();
}
}
在行*(messagefr[index].data) >= (messagefr[index].minRange)
中,错误&#34; void值不会被忽略,因为它应该是&#34;来了。
data是void指针,我为它赋值&stuctureA.data1
。
现在,在访问此数据信息时,*(messagefr[index].data)
我收到错误,如果我使用(messagefr[index].data)
,我会收到分配给数据的地址。
答案 0 :(得分:3)
在您的代码中,messagefr[index].data
的数据类型为void *
,您无法取消引用它。
你需要将其转换为其他完整类型才能解除它。
考虑到您正在将值与minRange
进行比较,例如
*(uint32_t *)(messagefr[index].data)
会奏效。
要添加关于 why 部分的一些细节,首先让我们看看完整和不完整的类型。引用
...]对象类型可能是 不完整(缺乏足够的信息来确定该类型对象的大小)或 完成(有足够的信息)。
现在,来到章节§6.5.3.2,一元*
运算符,
一元
*
运算符表示间接。如果操作数指向函数,则结果为 功能指示符;如果它指向一个对象,结果是一个左值指定 宾语。如果操作数具有类型为''的类型''指针,则结果的类型为''type''。 [...]
但是,从章节§6.2.5/ 19开始,我们知道
void
类型包含一组空值;它是一个不完整的对象类型 无法完成。
因此,无法取消引用指向void
的指针,因为结果类型(void
)不完整,并且无法确定结果对象所需的大小。因此,我们需要在尝试取消引用之前将指针强制转换为完整类型。