If I have a void pointer, how do I put an int into it?

扶醉桌前 提交于 2019-12-03 09:17:09

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!