gpt4 book ai didi

c - 文字 int 到 void *

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:34 25 4
gpt4 key购买 nike

翻译 GPOINTER_TO_INT and GINT_TO_POINTER对于普通 C,我得到:

#include <stdio.h>
#include <stdlib.h>

void *fn(void *v)
{
int *i;

i = malloc(sizeof(int));
*i = (int)(long)v;
return i;
}

int main(void)
{
int *i = fn((void *)(long)10);

printf("%d\n", *i);
free(i);
return 0;
}

它是可移植的吗?

为什么转换为 long

在 GTK 中用于回调,例如:

#define FLAG 10

static void panel_set_handler(GtkWidget *widget, gpointer data)
{
panel_set(GPOINTER_TO_INT(data));
}

g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(panel_set_handler), GINT_TO_POINTER(FLAG));

最佳答案

解决方案一:强制转换

最简单的,只需转换为intptr_t。这是 GLib 宏功能的正确版本。

方案二:使用堆

如果你有比 intptr_t 更大的东西,或者当你对大小没有信心时,你可以使用动态分配的内存指针,这次没有转换:

void* ToHeap(void const *data, size_t dataSize)
{
void* ret = malloc(dataSize);
if(ret != NULL)
memcpy(ret, data, dataSize);
return ret;
}

int FromHeap(void* heapPtr, void *data, size_t dataSize)
{
int ret = 0;
if(heapPtr != NULL)
{
memcpy(data, heapPtr, dataSize);
free(heapPtr);
ret = 1;
}
return ret;
}

这是一个用于 int 的包装器:

void* IntToHeap(int i)
{
return ToHeap(&i, sizeof(int));
}
int IntFromHeap(void*heapPtr, int defaultValue)
{
int ret;
if(!FromHeap(heapPtr, &ret, sizeof(int))
ret = defaultValue;
return ret;
}

你可以这样使用它:

#define FLAG 10

static void panel_set_handler(GtkWidget *widget, gpointer data)
{
panel_set(IntFromHeap(data, 0));
}

g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(panel_set_handler), IntToHeap(FLAG));

这种方式有点像你的帖子,减去了所有这些转换。

关于c - 文字 int 到 void *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17342495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com