2012-04-14 2 views
6

다음과 같은 코드가 있습니다.'void *'에서 'unsigned char *'로의 변환이 올바르지 않습니다.

void* buffer = operator new(100); 
unsigned char* etherhead = buffer; 

컴파일 할 때 다음과 같은 오류가 표시됩니다. 나는 그 오류를 이유는 무엇입니까

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

, 나는 무효라고 생각 "유형이없는"그것은 아무것도에 가리킬 수 있습니다, 또는 아무것도가 가리킬 수 있도록?

답변

9

먼저 void를 * 변환하지 않고 무엇이든 변환 할 수 없으므로 캐스트해야합니다. (당신이 static_cast도 사용할 수 있지만)

당신은

가 무효 포인터에 대한 자세한 내용은 6.13 — Void pointers 살펴보고

unsigned char* etherhead = (unsigned char*)buffer; 

을 할 필요가있다.

0
void *pt; 

pt=(void*)&i; 
pt=(void*)&dbl; 

다음은 어떻게 수행할까요?

+0

오 :(나는 10 바이트의 char 또는 10 바이트 int가 10 바이트 길이이므로 alloted 10 바이트의 값과 무관하게 나중에 사용할 수 있도록 X 바이트를 메모리에 할당 할 수 있다고 생각했습니다. 이 문제가 있습니까? – jwbensley

+0

메모리를 다시 사용하고자하는 이유가 있습니까? 그렇지 않다면 프로그램을 불필요하게 복잡하게 만듭니다. – Philipp

4

포인터를 void *로 변환 할 수 있지만 void *를 캐스트없이 다른 것으로 변환 할 수는 없습니다. "무효"가 모든 것을위한 기본 클래스이고 "int"와 "char"및 기타 등등이 모두 "void"의 하위 클래스라는 것을 상상하는 것이 도움이 될 수 있습니다.

1

C++은 C보다 더 안전 할 수 있도록 설계되었습니다. C 코드라면 OK일지도 모르지만 현재 사용중인 컴파일러에 따라 다릅니다. 또한

, 기술적, "통근"C "INT는 *"와 "INT *"다른 유형 ...

내가 C++ 스타일 대신 캐스팅 사용을 제안 (솔라리스 컴파일러처럼 이것을 선택할 것)된다 C 캐스트. 여기에 더 많은 설명이 있습니다 :

Regular cast vs. static_cast vs. dynamic_cast.

5

void* 아무것도 가리 수 있으며 당신이 캐스팅없이 void*에 아무것도에 대한 포인터를 변환 할 수 있지만 역을 할 수있는 static_cast을 사용해야합니다. 100 unsigned char의 동적으로 할당 된 버퍼를 원하는 경우

unsigned char* etherhead = static_cast<unsigned char*>(buffer); 

당신은이 일을하고 캐스팅을 피하는 것이 더 낫다.

unsigned char* p = new unsigned char[100]; 
3

여기에는 약간의 측면적인 생각이 있습니다. 캐스트 나 포인터가 필요할 때마다 다시 생각해보십시오. 는 new

std::vector<unsigned char> data(size); 

원시 포인터 : 당신이 필요로하는 모든 메모리 (100) 부호없는 바이트 인 경우 크기가 일정하지 않은 경우,

std::array<unsigned char, 100> data; 

또는

unsigned char data[100]; 

를 사용하여 벡터를 사용 연산자 및 캐스트는 안전하지 않으며, 올바르게 작동하기 어렵고 프로그램을 이해하기 어렵게 만듭니다. 가능하면 피하십시오.