如何在C中打印双指针值

时间:2018-06-07 09:51:36

标签: c pointers priority-queue opaque-pointers

我们在C中实现泛型类型数据的优先级队列。我们认为指针之间的赋值等是正确的,但我们不知道如何在结尾处打印“element”的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);
}

3 个答案:

答案 0 :(得分:1)

代码实际上甚至都没有编译,因为pqElement类型从未定义过,但只定义了_pqElement结构。

此外,您在%d中使用printf,但您传递的参数为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分配的内存,否则您可能会有内存泄漏!

答案 1 :(得分:1)

您不需要两个指针级别。

#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已经提到的那样。

使用不同类型的优先级也会使队列不那么通用。您需要提供不同的功能来进行分类,打印等。

答案 2 :(得分:-1)

谢谢你们,伙计们。 我需要代码也可以使用字符串,所以我喜欢这样:

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);
 }