【问题标题】:glib GHashtable dereference gpointerglib GHashtable 取消引用 gpointer
【发布时间】:2015-07-24 20:39:25
【问题描述】:

您好,这个问题与 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*指针,如何解引用?

谢谢

【问题讨论】:

    标签: c pointers glib dereference


    【解决方案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);
      ...
    }
    

    【讨论】:

    • 嘿,谢谢。如果我有一个 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) ?你能解释一下吗?谢谢。
    • 不一样。 %s 需要 char*。所以printf("%s\n", (char*)p) 工作正常。但是%d 需要一个整数(特别是int),所以你需要传递一个int*(char*)p) 将是p 指向的第一个字符指针的值,即"one" 中的o。所以它不会起作用。
    • 感谢您的cmets。
    • GLib 也有一些宏可以使指针中的推入整数稍微干净一些:gpointer aptr = GINT_TO_POINTER (5); gint anum = GPOINTER_TO_INT(aptr);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多