如果我有一个void指针,我该如何将int放入其中?
我有一个任意值的数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int
,字符数组等)。 但是,我如何实际为其分配一个int
?
以这些初始化为例:
void* data[10]; int x = 100;
我的直觉会想到这一点,但这会产生编译错误:
data[0] = malloc(sizeof(int)); *(data[0]) = x;
我还想过使用&x
,但我会取一个局部变量的地址,这个(据我所知)将在退出程序后被清除。 所以,如果我有一个局部变量x
,我怎样才能正确地将它变为void指针类型的变量?
*((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
union。 sizeof(union myvalues)
将是成员的最大sizeof
。 所以如果你有int i;
在联合中的char c[40]
, sizeof(union myvalues)
将为40.然后写入i
将覆盖c
的前4个字符(假设你的整数是4个字节)。
*((int *)data[0]) = x;
将制作x的副本,因此它是局部变量的事实并不重要。
虽然您可以使用强制转换进行分配,但编写代码可能更清晰:
void * data [10]; int x = 100; int * p; p = malloc(sizeof * p); data [0] = p; * p = x;
出于别名的原因,它做得更好
mempcy( data[0], &x, sizeof( int ) );
当发生这种情况时,编译器将优化memcpy调用,因为sizeof(int)是一个常量值,但它不会破坏各种别名规则。
试试这个:
data[0] = malloc(sizeof(int)); *((int*)data[0]) = x;
要么
(int) (*(data[0])) = x;
别忘了
free (data[0]);
然后。