我有一个任意值数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int
,字符数组等)。但是,我如何实际为其分配int
?
以这些初始化为例:
void* data[10];
int x = 100;
我的直觉会想到这一点,但这会产生编译错误:
data[0] = malloc(sizeof(int));
*(data[0]) = x;
我还考虑过使用&x
,但我会取一个局部变量的地址,这个(据我所知)将在退出程序后被清除。所以,如果我有一个局部变量x
,我怎样才能正确地将它变成一个void指针类型的变量?
答案 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]);
之后。