问题
I have an array of arbitrary values, so I have defined it as an array of void pointers, so I can point to any kind of information (like int
, character arrays, etc). However, how do I actually assign an int
to it?
Take for example these initializations:
void* data[10];
int x = 100;
My intuition would think this, but this gives a compile error:
data[0] = malloc(sizeof(int));
*(data[0]) = x;
Also I thought about using &x
, but I would take the address of a local variable, which (to my understanding) would be cleared after exiting from the procedure. So if I have a local variable x
, how would I get it into a void pointer type of variable correctly?
回答1:
*((int*)data[0])=x;
will do it.
You might want to consider using a union. Something like this:
union myvalues
{
int i;
double d;
long l;
};
You could then have
union myvalues *foo[10];
foo[0] = malloc(sizeof(union myvalues));
foo[0]->i = x;
You can also typedef
the union. sizeof(union myvalues)
will be the maximum of sizeof
the members. So if you have int i;
and char c[40]
in the union, sizeof(union myvalues)
will be 40. Writing to i
will then overwrite the first 4 characters in c
(assuming your ints are 4 bytes).
回答2:
*((int *)data[0]) = x;
A copy of x will be made, so the fact it is a local variable is not important.
回答3:
for aliasing reasons its far better to do
mempcy( data[0], &x, sizeof( int ) );
As it happens the compiler will optimise the memcpy call out as sizeof( int ) is a constant value but it won't break various aliasing rules.
回答4:
Although you can use a cast to make the assignment, it is probably much cleaner to write the code like:
void *data[ 10 ]; int x = 100; int *p; p = malloc( sizeof *p ); data[ 0 ] = p; *p = x;
回答5:
try this:
data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;
or
(int) (*(data[0])) = x;
don't forget to
free (data[0]);
afterwards.
来源:https://stackoverflow.com/questions/1327579/if-i-have-a-void-pointer-how-do-i-put-an-int-into-it