2009-08-25 45 views
10

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

就拿这些初始化:

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

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

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

我也想过用&x,但我想借此地址(根据我的理解)将在退出程序后被清除。所以,如果我有一个局部变量x,我将如何正确地将它变成无效指针类型的变量?

回答

24
*((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个字节)。

+0

或者干脆使用一个工会的数组,忘记malloc – 2009-08-25 11:23:51

+0

确实,好点。我与原来的距离最近。 – 2009-08-25 11:25:42

+0

谢谢,但这将与字符数组指针(char *)一起工作。这会不会在某些平台上导致对齐问题?最后,如果我有一个char [40],如果我只打算使用4,那么保留40个字节似乎会浪费内存。:-) – pbean 2009-08-25 11:36:12

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

将会创建一个x副本,所以它是一个局部变量并不重要。

1

的混叠方面的原因其远不如做

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

碰巧的编译器将优化的memcpy调用出来为的sizeof(int)的是一个恒定值,但它不会打破各种走样规则。

+0

哪个别名规则? – 2009-08-25 11:38:35

+0

我认为Goz担心类型窜改,但由于您无法解除引用void *,因此使用'void *'指针来替代别名通常是安全的。在将其转换为“int *”或“char *”以外的任何内容后,请勿对其进行解引用。 – 2009-08-25 12:35:24

2

虽然你可以使用一个投来进行分配,这大概是干净多写这样的代码:

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

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

我同意你这个简单的例子,那是我第一次去的方法。然而,问题是有许多不同的可能的数据类型等等,所以我将不得不声明大量的临时局部变量,这些变量可能会或可能不会在某个执行中使用。 – pbean 2009-08-25 12:20:56

+0

+1使用较少的标点符号 – sigjuice 2009-08-25 16:47:42

1

试试这个:

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

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

别忘了

free (data[0]); 

之后。

相关问题