2015-07-24 6 views
0

Привет Это проблемы, связанные с GLib, gpointer.glib GHashtable разыменовывает 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); 

Он выводит некоторые очень большие number.From мою сторону это не 296304, не является на самом деле значение 1. Я хочу знать, как разыменования указателя, как gpointer.

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

Благодаря

ответ

1

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

Изменить

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

в

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

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

insert_data(gpointer ptr) 
{ 
    int *p = ptr; 
    printf("%d\n", *p); 
    ... 
} 
+0

Эй, спасибо. Если у меня есть char * p = NULL; p = strdup («один»); Я назвал функцию insert_data (gpointer ptr), такую ​​как insert_data (p); Я могу напечатать указатель как printf («% s \ n», p); или printf ("% s \ n", (char *) p). Он отлично работает и печатает «один». Почему бы не использовать printf ("% s \ n", \ * (char \ *) p) то же самое, что и целочисленный указатель? Не могли бы вы объяснить это немного больше? Благодарю. – user1323328

+0

Это не то же самое. '% s' ожидает' char * '. Поэтому 'printf ("% s \ n ", (char *) p)' отлично работает. Но '% d' ожидает целое число (int конкретно), поэтому вам нужно передать' int'. '* (char *) p)' будет значением первого указателя char на 'p' i.e.' o' в '' one ''. Так что это не сработает. –

+0

Спасибо за ваши комментарии. – user1323328

 Смежные вопросы

  • Нет связанных вопросов^_^