如何在C中打印双指针值

如何在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

我们正在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);
}

由于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。要打印,您需要删除前导的*。顺便说一句:这不是答案,您不应该将其作为答案发布。而是添加一个新问题或扩展您的问题。