2012-03-01 2 views
0

void *에 의해 지정된 값을 void * 배열에 할당하려고합니다. 이 컴파일러 오류와c, void *가 가리키는 값을 할당 * void * array

23 void queue_enqueue(void *q, void *item) { 
24 int len = 0 ; 
25 
26 len = sizeof(q) ; 
27 q[len-1] = 
28  item ; 
29  
30 return ; 
31 
32 } 

:

myqueue.c:27: warning: dereferencing ‘void *’ pointer 
myqueue.c:28: error: invalid use of void expression 

지금에 대한 시간 동안 대답을 찾고 있었어요,하지만 비슷한 구현을 보지 못했다 여기에 지금까지 무엇을 가지고 내가 여기에 주어진 것에. 혹시 궁금한 점이 있으시면, 숙제이며 프로토 타입은 강사가 주셨습니다.

공백으로 전달되기 때문에 gcc typeof 연산자를 사용할 수 없습니다.

경고가 표시됩니다. 나는 "당신을 위해 이것을 확인하지 않을 것임을 조심하십시오."라고 말하는 gcc 일 뿐이며, 28 행의 오류를 없앨 수는 없다는 것을 알고 있습니다.

미리 감사드립니다.

void*의 배열이 아니다
+0

호기심에서 벗어나서 왜 이것을하고 싶습니까? –

+0

'sizeof'는 배열의 요소 수가 아닌 포인터의 크기를 알려줍니다. – asaelr

+0

@Calvin - 대기열을 만들고 데이터 중복성을 없애기 위해 데이터 형식을 유지할 수 있도록 허용합니다. – FatAdama

답변

3

, 그것은 (실제로 존재하지 않는) void의 배열, 그리고 당신이 할당 할 수 있습니다, 그것은 당신에게 "이 아닌 실제 타입이"인 void, 도착 역 참조 그것. 당신이 void*의 배열 작업

void queue_enqueue(void** q, void* item) 

또는

void queue_enqueue(void* q[], void* item) // same as above 

로 변경하려는 경우

또한 프로그램이

q[sizeof(void**) - 1] = item; 

모든 할 것 실현 시각. sizeof은 배열이 아닌 포인터 유형의 크기를 제공합니다. 배열의 길이를 알고 싶으면 배열의 길이를 별도의 인수로 전달해야합니다.

+0

사용시 : char * c; c = malloc (10); 개별 요소에 액세스 할 수 있습니다. 나는 그와 같이 창조했다 : void * myqueue; myqueue = (void **) malloc (n); 배열을 사용하여 개별 요소에 액세스 할 수 있다고 생각했습니다. 교수는 우리에게 다음 .h 파일을 (우리가 사용해야합니다) 우리에게 줬습니다. : void * queue_new (int numItems); void queue_enqueue (void * q, void * item); void * queue_dequeue (void * q); int queue_isEmpty (void * q); – FatAdama

+0

@ user1042739 이들은 정말 모호한 함수 프로토 타입입니다. 예를 들어, 단지 포인터로 큐가 비어 있는지 어떻게 알 수 있습니까? 나는 당신의 교수님에게 이것이 어떻게 작동해야하는지에 대한 더 자세한 정보를 요구할 것입니다. 또한'void **) malloc (n)'을 쓸 수 없다.'void ** '에 대한 포인터 포인터가되기 때문이다. 'char's. –

1

당신은 void*의 배열을 필요

void queue_enqueue(void *q[], void *item) 
0

무효가 더 크기와 유형입니다. 따라서 void 배열은 존재할 수 없습니다. (배열은 단위의 양을 정의한 다음 sizeof() 연산자를 사용하여 점프하기 때문에

void *를 무언가 *에 캐스트해야합니다. 실제로 거기에 저장된 것과 동일한 크기를 가지기 때문에 당신은 (내가 같은 일을 말하고 있지 않다) 같은 크기이다 유형 T,이

T* q2 = (T*)q; 
T* item2 = (T*)item; 
q2[len-1] = &item; 

C 참조로 포인터를 전달하기 때문에이 작동합니다.
를 T 컴파일러가 당신을 할 수있는 실제 유형이 될 것이기 때문에 do
T는 실제 저장된 값과 크기가 같으므로 올바른 값의 저장 위치를 ​​지정하십시오.

void *를 배열로 사용하면 void 형식의 배열에 대한 포인터가 포함됩니다. void * 단일 값으로 단일 값인 void가 포함됩니다.

+0

또한 길이에 대해 다음을 사용하십시오. len = sizeof (& q)/sizeof (T); –

관련 문제