如何在C中打印双指针值
我们正在C中为泛型数据类型实现一个优先级队列。我们认为指针等之间的赋值是正确的,但我们不知道如何在末尾打印元素的int值。你能帮我吗如何在C中打印双指针值,c,pointers,priority-queue,opaque-pointers,C,Pointers,Priority Queue,Opaque Pointers,我们正在C中为泛型数据类型实现一个优先级队列。我们认为指针等之间的赋值是正确的,但我们不知道如何在末尾打印元素的int值。你能帮我吗 #include <stdio.h> #include <stdlib.h> struct _pqElement{ void** data; void** priority; }; pqElement* pqElement_new(void* data, void* priority){ pqElement* result
#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);
}
由于pqElement类型从未定义过,但只定义了_pqElement结构,因此代码本身甚至没有编译 您还在printf中使用%d,但是您传递的参数是void**,因此需要强制转换该值 这些变化应该会带来以下好处:
#include <stdio.h>
#include <stdlib.h>
typedef struct _pqElement{
void** data;
void** priority;
} pqElement;
pqElement* pqElement_new(void* data, void* priority){
static pqElement* result;
result = (pqElement*) malloc (sizeof(pqElement));
result->data=&data;
result->priority=&priority;
return result;
}
int* new_int(int value){
static int *elem;
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\n", **((int**)(element->data)), **((int**)(element->priority)));
//need to free the memory allocated with the malloc, otherwise there is a possibility of memory leakage!
}
这将只打印第一个元素,但您可以使用偏移量指向以下元素
注意:正如我在代码中作为注释报告的那样,您需要释放使用malloc分配的内存,否则可能会出现内存泄漏 您不需要两级指针
#include <stdio.h>
#include <stdlib.h>
struct pqElement{
void *data;
void *priority;
};
struct pqElement* pqElement_new(void* data, void *priority)
{
struct pqElement* result = malloc(sizeof(struct pqElement));
result->data = data;
result->priority = priority;
return result;
}
static int* new_int(int value)
{
int *elem = malloc(sizeof(int));
*elem=value;
return elem;
}
int main(int argc, char const *argv[])
{
struct pqElement *element = pqElement_new(new_int(1), new_int(85));
printf("%d-%d", *(int*)element->data, *(int*)element->priority);
}
最后,如Alexander Pane所述,打印值需要以正确的方式强制转换指针
使用不同的优先级类型也会使队列不那么通用。您需要为排序、打印等提供不同的功能。谢谢大家。
我需要的代码也与字符串,所以我这样做:
static char* new_string(char* value){
char* elem= malloc (sizeof(char));
strcpy(elem, value);
return elem
}
int main(int argc, char const *argv[]){
struct pqElement *element = pqElement_new(new_string("Hello"), 85);
printf("%s-%d", *(char*)element->data, element->priority);
}
这样打印出来:
static char* new_string(char* value){
char* elem= malloc (sizeof(char));
strcpy(elem, value);
return elem
}
int main(int argc, char const *argv[]){
struct pqElement *element = pqElement_new(new_string("Hello"), 85);
printf("%s-%d", *(char*)element->data, element->priority);
}
我们认为指针等之间的赋值是正确的,不,它们不是:结果->数据=&data;指定指针本地副本的地址。离开函数后,此地址无效。使用结果->数据=数据;相反优先级也是一样为什么要存储指向指针的指针?为什么要使用指针,甚至是指针指向优先级?因为我们不知道要在队列中存储什么类型的数据。这就是为什么在结构中我们有一个void**指针来存储new_int给出的指针。但是我修复了result->data=data,但是你仍然知道如何打印它所指向的整数值吗?void*有什么问题吗?它可以指向任何数据类型。事实上,void*可以指向任何对象,但是void**应该只指向void*对象,所以void*更一般。在pqElement_new中使用非静态地址(返回后无效)的问题也存在于您的代码中。添加的静态关键字是否旨在解决此问题?抱歉,我实际上使用了错误的静态关键字。我更新了答案。添加static关键字可以确保变量存储在内存的静态部分,而不是堆栈中。前面的答案有效,但存在安全问题,因为函数终止时会取消引用函数的堆栈变量,指针可能会被覆盖。你可以在这里找到一些关于内存划分的细节:数据和优先级的使用是问题所在,而不是元素。我们将优先级设置为void*因为我们还需要使用相同的代码来实现Prim算法,该算法的权重为float值。你需要分配strlenvalue+1字节。不仅是1。要打印,您需要删除前导的*。顺便说一句:这不是答案,您不应该将其作为答案发布。而是添加一个新问题或扩展您的问题。