【发布时间】:2018-06-07 09:51:35
【问题描述】:
我们正在为 C 中的通用类型数据实现一个优先级队列。我们认为指针等之间的分配是正确的,但我们不知道如何在最后打印“元素”的 int 值。你能帮助我吗?
#include <stdio.h>
#include <stdlib.h>
struct _pqElement{
void** data;
void** priority;
};
pqElement* pqElement_new(void* data, void* priority){
pqElement* result = (pqElement*) malloc (sizeof(pqElement));
result->data=&data;
result->priority=&priority;
return result;
}
static int* new_int(int value){
int *elem=(int*)malloc(sizeof(int));
*elem=value;
return elem;
}
int main(int argc, char const *argv[]){
pqElement * element = pqElement_new(new_int(1), new_int(85));
printf("%d-%d", element->data, element->priority);
}
【问题讨论】:
-
“我们认为指针等之间的分配是正确的,”不,它们不是:
result->data=&data;您分配了指针的本地副本的地址。离开该功能后,该地址无效。请改用result->data=data;。priority相同 -
为什么要存储指向指针的指针?为什么要使用指针(甚至指向指针的指针)作为优先级?
-
因为我们不知道要在队列中存储什么类型的数据。这就是为什么在结构中我们有一个 void** 指针来存储“new_int”给出的指针。但是我修复了result->data=data,但是你仍然知道如何打印出它所指向的整数值吗?
-
改用
void*有什么问题?它可以指向任何数据类型。 -
其实
void*可以指向任何东西,但void**只能指向void*对象,所以void*更通用。
标签: c pointers priority-queue opaque-pointers