2011-08-15 31 views
13

Ok, to stało się tak bardzo mylące dla mnie. Ja po prostu nie wiem, co jest nie tak z tym zadaniem:Jak przekonwertować wskaźnik pustego kształtu na wskaźnik znakowy w C

void *pa; void *pb; 
char *ptemp; char *ptemp2; 

ptemp = (char *)pa; 
ptemp2 = (char *)pb; 

Czy ktoś może mi powiedzieć, dlaczego ja dostaję ten błąd:

error: invalid conversion from ‘void*’ to ‘char*’

+6

Ten kod nie spowoduje żadnych błędów (zakładając właściwy kontekst). Nie ma nic nieważnego w tych konwersjach. Błędy takie jak te są zwykle generowane dla przypisania 'ptemp = pa' w C++ (tzn. Bez rzutowania, kompilator C++). Twierdzisz, że używasz kompilatora C i masz tam wyraźną obsadę. W twoim przypadku nie będzie takiego błędu. Wpisz post prawdziwy kod. – AnT

+1

Jaki kompilator? Czy jest to kompilator języka C, a nie kompilator C++? Jak to jest, masz legalne C i przejdziesz przez 'gcc' bez żadnych problemów w trybie standardów C99. –

+1

To dziwny komunikat o błędzie ... –

Odpowiedz

21

Właściwie, to musi być coś nie tak z kompilatora (albo nie opowiedziałeś całej historii). Jest całkowicie legalne, aby przesłać void* do char*. Ponadto, konwersja jest niejawna w C (w przeciwieństwie do C++), to znaczy, że następujące powinny opracować również

char* pChar; 
void* pVoid; 
pChar = (char*)pVoid; //OK in both C and C++ 
pChar = pVoid;  //OK in C, convertion is implicit 
+0

Używam kompilatora g ++ i skompilowałem kod w oknach visuall C++ bez problemu, ale z g ++ otrzymuję ten błąd – Jimmy

3

Próbowałem tylko swój kod w module o nazwie temp.c. Dodałem funkcję o nazwie f1.

void *pa; void *pb; 
char *ptemp; char *ptemp2; 

f1() 
{ 
     ptemp = (char *)pa; 
     ptemp2 = (char *)pb; 
} 

W systemie Linux wprowadziłem gcc -c temp.c, a to zostało skompilowane bez błędów i ostrzeżeń.

Na którym OS próbujesz tego?

+7

Dlaczego system operacyjny ma znaczenie? –

+0

Używam g ++ jako kompilatora, a nie gcc. Może gcc ma z tym problem? – Jimmy

+0

Thannk you as I był przy użyciu niewłaściwego kompilatora – Jimmy