如果我有一个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]); 

然后。