2014-10-20 114 views
2

我有以下代碼:C,錯誤:表達式必須爲可修改的左值

#define NULL ((void*)0) 
void* Globalptr = NULL; 
void func(ptrtype* input) 
{ 
((ptrtype*)Globalptr) = input; 
} 

我得到線((ptrtype*)Globalptr) = input;錯誤說「表達必須修改的左值」

+0

爲什麼你需要#define NULL?需要對值進行類型轉換以適應變量。 – Gopi 2014-10-20 12:01:19

+3

應該通過包含'stdlib.h'或其他定義它的頭文件來引入'NULL';不要自己寫。 – 2014-10-20 12:02:23

回答

7

必須使數據相匹配的變量(左值),並不會改變變量的類型相匹配的數據:

Globalptr = (void*)input; 

但因爲你可以將任何數據指針轉換爲void* C,你可以簡單地做:

Globalptr = input; 
3

當使用空指針,必須強制類型轉換一樣

Globalptr = (void *)input; 

,而不是像

((ptrtype*)Globalptr) = input; 
+1

'Globalptr =(ptrtype *)input;'在這種情況下沒有意義,因爲它已經是ptrtype * – 2014-10-20 11:59:17

0

請確保您應該包括頁眉文件stdlib.h引入NULL,也不要像你所做的那樣自行創建NULL。

#include<stdlib.h> 
void* Globalptr = NULL; 
void func(ptrtype* input) 
{ 
    Globalptr = input; 
} 
0

這始終工作無論指針的類型是(在函數內部,爲你的):

Pointer_Type pointer_1 = *((Pointer_Type*) pointer_2); 
0

這本來是有道理的,如果GlobalPtr是類型的「ptrtype *」,並輸入了鍵入「無效*」像下面的:

ptrtype *Globalptr = NULL; 
void func(void *input) 
{ 
    Globalptr = (ptrtype *)input; 
} 

你的情況,你可以做的就是從Globalptr「無效*」到「ptrtype *」轉換。 像其他人一樣,不應該以這種方式使用「NULL」。

0

這裏真正的問題是演員陣產生一個右值,賦值運算符的左操作數需要一個可修改的左值。

這就是爲什麼表達式((ptrtype *)Globalptr)不正確,正如其他人指出的那樣,在賦值運算符的右側進行轉換。詳情請參閱lvalue_rvalue_link

相關問題