Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 使用void指针来推进泛型堆栈?_Pointers_Void - Fatal编程技术网

Pointers 使用void指针来推进泛型堆栈?

Pointers 使用void指针来推进泛型堆栈?,pointers,void,Pointers,Void,我想知道这是否可能,但您是否可以使用void指针来实现通用堆栈(或任何其他通用结构)。例如,我正在尝试下面的代码代码。push和pop的函数可以编译,但我不知道如何在main中处理它们 我想知道这是否可能?当您像我在结构定义中那样创建一个空指针时,这并没有为数据分配任何实际存储,是吗?例如,在推送例程中: 元素->数据=数据//这不会创建任何新的存储,数据指向现有变量 在我看来,在C中执行类似操作的唯一方法是传递一个空指针,并使用if语句分别处理每个数据类型(数据类型必须作为输入传递)?是这样吗

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

我想知道这是否可能?当您像我在结构定义中那样创建一个空指针时,这并没有为数据分配任何实际存储,是吗?例如,在推送例程中:

元素->数据=数据//这不会创建任何新的存储,数据指向现有变量

在我看来,在C中执行类似操作的唯一方法是传递一个空指针,并使用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.
}

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

void*void\u ptr=
(void*)指向int的指针

棘手的部分是在弹出时返回到
int
——这需要知道堆栈包含
int
,而不是
float

希望有帮助