Как напечатать значение двойного указателя в C - PullRequest
0 голосов
/ 07 июня 2018

мы реализуем очередь приоритетов для универсального типа данных в C. Мы думаем, что назначения между указателями и т. Д. Сделаны правильно, но мы не понимаем, как в конце вывести значение int элемента "element".Вы можете мне помочь?

#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 голосов
/ 07 июня 2018

Вам не нужны два уровня указателей.

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

Наконец, для печати значения необходимо правильно навести указатель, как уже упоминал Александр Пейн.

Использование различныхтип для приоритета также сделает очередь немного менее общей.Вам необходимо предоставить различные функции для сортировки, печати и т. Д.

0 голосов
/ 07 июня 2018

Спасибо, ребята.Мне нужно, чтобы код работал также со строками, поэтому я сделал так:

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);
 }
0 голосов
/ 07 июня 2018

Ну, код, как он есть, даже не компилируется, так как тип 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, иначе у вас есть потенциалутечка памяти!

...