簡體   English   中英

是否允許對左值操作進行類型轉換?

[英]Is typecasting on lvalue of operation not allowed?

我有下面的代碼,我正在做一個整數指針到void指針的類型轉換,並嘗試分配char地址。

void main()
{
   int *ptr;
   char a = 10;
   (void *)ptr = &a;
   printf("%d\n", *ptr);
}

我收到以下錯誤,無論如何,我能解決這個問題嗎?

error: lvalue required as left operand of assignment
    (void *)ptr = &a;

是的, 您不能在C中轉換賦值運算符的左操作數

另外,在您的情況下,您可以通過另一種方式使代碼工作:

void main()
{
   int *ptr;
   char a = 10;
   ptr = (int*) &a; // this is perfectly fine
   printf("%d\n", *ptr);
}

左值上的強制轉換有效,即(void *)ptr本身有效,但它不再是左值。 這稱為左值轉換

正如@Joachim評論的那樣:

ptr = (int *) &a;
ptr = (int *)&a ;

更自然,但它不便攜。 可能會給它在小端機器上工作的印象(現在大部分時間),但依賴於字節后面&a為空。 事實並非如此。

我會建議

printf("%d\n", (int)a) ;

變量或表達式的類型轉換導致r值。 so(void *)ptr給出了r值,你試圖將&a分配給r值。 它是像0x12345 =&a這是錯誤的,所以你需要l值。

這個問題不符合您的例子-但回答你的問題 (而不是你的例子) -是肯定的-你可以。 這是如何做:

void encode_fixed32(char *buffer,float input) {
  ((float *)buffer)[0]=input;
}

void decode_fixed32(char *buffer) {
  return ((float *)buffer)[0];
}

編輯 :這個答案只適用於C ++,而不是C,但可能仍然相關。

你必須將你的左值轉換為引用指針而不是指針,然后賦值將起作用:

void main()
{
   int *ptr;
   char a = 10;
   (void *&)ptr = &a;
   printf("%d\n", *ptr);
}

注意 after void * 這樣你就可以保留它的左值,你可以分配它。

但是,在這種特殊情況下,printf行為仍然是未定義的,因為您將char重新解釋為int,即使您假設為小端,在字節表示10之后仍可能有3個未定義的字節。

一個更好的用例:

int a[5];
int *ptr = a + 2; // points to the element with index=2
(char *&)ptr += sizeof(int); // advances the pointer to the next element

這很有用,例如當您在CUDA或嵌入式設備上對數組進行跨步循環時,您希望提前緩存准確的步驟以避免每次在循環內乘以4:

const int stride = sizeof(int)*step;
int *my_ptr = first_ptr;
for (int i = 0; i < count; ++i) {
    ...
    (char *&)my_ptr += stride;
}

暫無
暫無

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

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