glib GHashtable разыменование gpointer

Привет. Это проблемы, связанные с GLib, gpointer.

Я создаю значение с типом gpointer.

    gpointer        keys;

я вызвал функцию

insert_data(gpointer key);

Я передал целочисленный указатель на эту функцию вот так.

int* p = malloc(sizeof(int));
*p = 1;
// gpointer is void* pointer, I cast it to integer type pointer here.
insert_data(p);

Внутри функции я хочу видеть значение p.

printf("%d\n", (int*)p);

Он выводит какое-то очень большое число. С моей стороны это 296304, а не фактическое значение 1. Я хочу знать, как разыменовать указатель, такой как gpointer.

Для целочисленного 32-битного указателя, указателя char *, как их разыменовать?

Спасибо


person user1323328    schedule 24.07.2015    source источник


Ответы (1)


Вы пытаетесь напечатать сам указатель. Технически это неопределенное поведение, поскольку вы используете неправильный спецификатор формата. для печати указателя. То, что вы видите, является целочисленной интерпретацией указателя p.

Изменять

printf("%d\n", (int*)p);

to

printf("%d\n", *(int*)p);

Или вы можете сделать:

insert_data(gpointer ptr)
{
  int *p = ptr;
  printf("%d\n", *p);
  ...
}
person P.P    schedule 24.07.2015
comment
Эй, спасибо. Если у меня есть char* p = NULL; р = поток (один); Я вызвал функцию insert_data(gpointer ptr) как insert_data(p); Я могу напечатать указатель как printf(%s\n, p); или printf(%s\n, (char*)p). Он отлично работает и печатает один. Почему бы не использовать printf(%s\n, *(char*)p) так же, как целочисленный указатель? Не могли бы вы объяснить это немного подробнее? Благодарю. - person user1323328; 24.07.2015
comment
Это не одно и то же. %s ожидает char*. Так что printf("%s\n", (char*)p) работает нормально. Но %d ожидает целое число (в частности, int), поэтому вам нужно передать int. *(char*)p) будет значением первого указателя char на p, т.е. o в "one". Так что это не сработает. - person P.P; 25.07.2015
comment
Спасибо за ваши Коментарии. - person user1323328; 25.07.2015
comment
В GLib также есть несколько макросов, которые делают размещение целых чисел в указателях немного чище: gpointer aptr = GINT_TO_POINTER (5); gint anum = GPOINTER_TO_INT(aptr); - person TingPing; 27.07.2015