编译器警告 - 从指针转换为不同大小的整数

Dav*_*idL 6 c generics

我正在尝试创建一个可以保存通用值的结构.下面的代码有效,但我收到一个关于从指针到整数的强制转换的编译器警告.这是在64位系统上.

struct node
{
    void *key;
    void *value;
};

void insert(struct node *ht, void *key, void *value)
{
    ht->key = key;
    ht->value = value;
    return;
}

int main()
{
    struct node *t = (struct node *)malloc(sizeof(struct node));
    insert(t, (void *)3, (void *)5);
    printf("[%d]->[%d]\n", (int)t->key,(int)t->value);
    free(t);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我甚至不确定这是否是正确的方法.我有点黑了.如果有正确的方法,请告诉我.

ugo*_*ren 9

编译器会尝试警告您在转换为void *to 时丢失位int.它不知道它void *实际上是一个int演员,所以失去的位是没有意义的.

双重演员可以解决这个问题(int)(uintptr_t)t->key.
它首先转换void *uintptr_t(相同大小,没有警告),然后转换uintptr_tint(数字到数字,没有警告).
您需要包括<stdint.h>具有uintptr_t类型(整型具有相同大小的指针).