void指针:出了什么问题?

时间:2014-04-01 10:46:58

标签: c void-pointers

我有一个3字节的变量,但由于C中没有3字节变量,我使用的是长32位。然后我想在总线上只发送3个字节。我作为ext Ram 8位宽度访问总线。 要只发送3个字节,我需要将long值分解为2字节(短)和1字节(字符)。

我所做的是:

typedef union
{
  unsigned char b[3];
  unsigned long lng;
} lng_array;

void SendLong(unsigned long d)
{   
  volatile void* c =(void*)Dat; // Dat is a #defined long number equal to the address on the bus that data must be sent
  lng_array tmp;
  tmp.lng=d;
  *c=*(unsigned short*)(&tmp.b[0]);  // Error
  *c=*(unsigned char*)(&tmp.b[2]);   // Error
}

表示2" * c ="我得到一个错误:"错误36无效使用void表达式"

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

如果*cc,则

void*没有意义(无法解除引用),因为编译器需要知道它的大小。再将其投放到unsigned char*,例如:*((unsigned char*)(c)) = (unsigned char*)(&tmp.b[2]);

答案 1 :(得分:2)

由于变量c是指向void的指针类型,因此您无法取消引用它(例如读/写*c)。如果你想访问它所指向的内存,你必须添加一个类型转换。

C标准声明

  

6.3.2.2 void

     

void表达式的(不存在的)值(具有的表达式)   类型void)不得以任何方式使用,......

并且由于c是指向void dereferencing的类型指针,因此它会生成一个void表达式,然后不能用于任何内容。无论等号的另一面是什么,与此无关。