[英]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表達式”
我在這里做錯了什么?
如果c
為void*
*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.