[英]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.