13

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

以这些初始化为例:

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

我的直觉会这样认为,但这会产生编译错误:

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

我也考虑过使用&x,但我会获取一个局部变量的地址,(据我所知)在退出过程后会被清除。因此,如果我有一个局部变量x,我将如何正确地将其转换为 void 指针类型的变量?

4

5 回答 5

29
*((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将覆盖前 4 个字符c(假设你的整数是 4 个字节)。

于 2009-08-25T11:17:23.047 回答
11
*((int *)data[0]) = x;

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

于 2009-08-25T11:16:32.020 回答
4

出于混叠的原因,这样做要好得多

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

碰巧编译器将优化 memcpy 调用,因为 sizeof(int) 是一个常量值,但它不会破坏各种别名规则。

于 2009-08-25T11:37:07.937 回答
2

尽管您可以使用强制转换来进行分配,但编写如下代码可能更简洁:

无效*数据[10];
诠释 x = 100;
诠释* p;

p = malloc( sizeof *p );
数据[0] = p;
*p = x;
于 2009-08-25T11:40:20.177 回答
1

试试这个:

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

或者

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

不要忘记

free (data[0]);

然后。

于 2009-08-25T12:43:19.010 回答