使用void指针实现通用堆栈?

时间:2011-03-28 23:12:17

标签: pointers void

我想知道这是否可能,但是你可以使用void指针来实现通用堆栈(或任何其他通用结构)。例如,我正在尝试代码下面的代码。 push和pop编译的功能,但我不明白如何在main中处理它们。

我想知道这是否可能?当你像在结构定义中那样创建一个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 个答案:

答案 0 :(得分:2)

首先,void *可以用作任何指针类型的占位符。我不完全确定你在问什么,但如果你想要一堆int,那么你可以创建你的对象(在堆上),然后将指针传递给int方法 - 但是你必须将指针强制转换为void

void * void_ptr = (void*)pointer_to_int

当您弹出时,棘手的部分会回流到int - 这需要知道堆栈包含int而不是float等。

希望有所帮助。