如果我有一个void指针,我该如何将int放入其中?

时间:2009-08-25 11:13:03

标签: c pointers void-pointers

我有一个任意值数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int,字符数组等)。但是,我如何实际为其分配int

以这些初始化为例:

void* data[10];
int x = 100;

我的直觉会想到这一点,但这会产生编译错误:

data[0] = malloc(sizeof(int));
*(data[0]) = x;

我还考虑过使用&x,但我会取一个局部变量的地址,这个(据我所知)将在退出程序后被清除。所以,如果我有一个局部变量x,我怎样才能正确地将它变成一个void指针类型的变量?

5 个答案:

答案 0 :(得分:27)

*((int*)data[0])=x;

会这样做。

您可能需要考虑使用联合。像这样:

union myvalues
{
    int i;
    double d;
    long l;
};

然后你可以

union myvalues *foo[10];
foo[0] = malloc(sizeof(union myvalues));
foo[0]->i = x;

你也可以typedef结合。 sizeof(union myvalues)将是sizeof成员的最大值。因此,如果联盟中有int i;char c[40]sizeof(union myvalues)将为40.写入i将覆盖c中的前4个字符(假设你的整数是4个字节)。

答案 1 :(得分:10)

*((int *)data[0]) = x;

将制作x的副本,因此它是一个局部变量并不重要。

答案 2 :(得分:2)

出于别名的原因,做得好得多

mempcy( data[0], &x, sizeof( int ) );

当发生这种情况时,编译器将优化memcpy调用,因为sizeof(int)是一个常量值,但它不会破坏各种别名规则。

答案 3 :(得分:2)

虽然您可以使用强制转换进行分配,但编写代码可能更清晰:

void *data[ 10 ];
int x = 100;
int *p;

p = malloc( sizeof *p );
data[ 0 ] = p;
*p = x;

答案 4 :(得分:1)

试试这个:

data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;

(int) (*(data[0])) = x;

别忘了

free (data[0]);

之后。