2011-03-28 5 views
1

이것이 가능한지 궁금하지만 일반 포인터 (또는 다른 일반적인 구조체)를 구현하기 위해 void 포인터를 사용할 수 있습니까? 예를 들어, 코드 아래 코드를 시도하고 있습니다. 푸시와 팝용 함수는 컴파일되지만, main에서 처리하는 방법을 이해하지 못합니다.void 포인터를 사용하여 제네릭 스택을 구현 하시겠습니까?

이것이 가능한지 궁금합니다. 구조체 정의 에서처럼 void 포인터를 만들면 데이터를위한 실제 저장소를 할당하지 않습니다. 예를 들어, 푸시 루틴에서 :

elem-> data = data; // 이것은 새로운 저장 공간을 만들지 않고 기존 변수를 가리키는 데이터입니다

C에서 이와 같은 작업을 수행하는 유일한 방법은 void 포인터를 전달하고 각 데이터 유형을 개별적으로 처리하는 if 문을 사용하는 것입니다. (데이터 유형은 입력으로 전달되어야 함)? 그게 맞습니까?

typedef struct Element { 
struct Element *next; 
void *data; 
} element; 

typedef element * element_ptr; 
typedef void * void_ptr; 
typedef int * int_ptr; 

void pop (element_ptr *stack, void_ptr *data) 
{ 
element *elem; 
elem = *stack; 
*data = elem->data; 
*stack = elem->next; 
free(elem); 
} 

void push (element_ptr *stack, void *data) 
{ 
element *elem; 
elem = (element *) malloc(sizeof(element)); 
elem->data = data; 
elem->next = *stack; 
*stack = elem; 
} 

main() 
{ 
element *stack; 
    void *data; 
    int num, num2; 
    int_ptr num_ptr; 

    num_ptr = &num2; 

    num = 5; 
    push(&stack,&num); 
    pop(&stack,&num_ptr); //This line gives a warning 

    printf("Popped %d from stack\n",num2); //Does not work. 
} 

답변

1

먼저 포인터 유형에 대한 자리 표시 자로 void *을 사용할 수 있습니다. 나는 당신이 무엇을 요구하고 있는지 완전히 모르겠다. 그러나 만일 당신이 int의 스택을 원한다면, 당신은 힙에서 당신의 객체를 생성 할 수있다. 그리고 int에 대한 포인터를 push 메소드에 전달할 수있다. 그러나 포인터를 캐스팅해야한다. void에 :

무효 * void_ptr = (void*)pointer_to_int

당신이 팝업 때 까다로운 부분은 int 다시 캐스팅되어 -이 스택 도움이 int하지 float

희망을 보유하고 있음을 알고 있어야합니다.

관련 문제