簡體   English   中英

void指針:怎么了?

[英]void pointer : what is wrong?

我有一個3字節的變量,但是由於C中沒有3字節的變量,所以我改用32位長的變量。 然后我只想在總線上發送3個字節。 我以ext Ram 8位寬度訪問總線。 要僅發送3個字節,我需要將long值分成2個字節(一個short)和1個字節(一個char)。

我要做的是:

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表達式”

我在這里做錯了什么?

如果cvoid* *c毫無意義(無法取消引用),因為編譯器將需要知道它的大小。 再次將其轉換為unsigned char* ,例如: *((unsigned char*)(c)) = (unsigned char*)(&tmp.b[2]);

由於變量c是指向void的指針,因此您無法取消引用它(例如,讀/寫*c )。 如果要訪問它指向的內存,則必須添加類型轉換。

C標准指出

6.3.2.2無效

void表達式(類型為void的表達式)的(不存在)值不得以任何方式使用,...

並且由於c是指向void取消引用的類型指針,因此它會生成一個void表達式,該表達式不能用於任何東西。 等號另一側的任何內容都與此無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM