开发者

How do I convert from void * back to int in C

if I have

int a= 5;
long b= 10;
int count0 = 2;
void ** args0;
args0 = (void **)malloc(count0 * sizeof(void *));
args0[0] = (void *)&a;
args0[1] = (void *)&b;

how can I convert from args[0] and args0[1] back to int and long? for example

int c=(something im开发者_如何学Go missing)args0[0]
long d=(something im missing)args1[0]


Assuming that your &a0 and &b0 are supposed to be &a and &b, and that you mean args0[1] for setting up long d, you have stored a pointer to a in args0[0] and a pointer to b in args0[1]. This means you need to convert them to the correct pointer types.

int c = *((int *)args0[0]);
int d = *((long *)args0[1]);


To literally answer your question, you'd write

int c = *((int *)args0[0]);
long d = *((long *)args[1]);

What might concern me about your code is that you have allocated space for the pointers to your locations, but you haven't allocated memory for the values themselves. If you expect to persist these locations beyond the local scope, you have to do something like:

int *al = malloc(sizeof(int));
long *bl = malloc(sizeof(long));
*al = a;
*bl = b;
void **args0 = malloc(2 * sizeof(void *));
args0[0] = al;
args0[1] = bl;


Try this:

 int c =  *( (int *)  args0[0]);

 long d = *( (long *) args0[1]);


You need to tell it that the void* should be interpreted as an int* or long* when you dereference.

int a = 5;
long b = 10;
void *args[2];
args[0] = &a;
args[1] = &b;

int c = *(int*)args[0];
long d = *(long*)args[1];


While others have answered your question, I will make a comment about the last three lines in the first part of your code snippet:

args0 = (void **)malloc(count0 * sizeof(void *));
args0[0] = (void *)&a;
args0[1] = (void *)&b;

The above is better written as:

args0 = malloc(count0 * sizeof *args0);
args0[0] = &a;
args0[1] = &b;

The malloc() call is easier to read this way, and less error-prone. You don't need a cast in the last two statements since C guarantees conversions to and from an object pointer and a void pointer.


If you're testing, i suggest use it an external function, to get more readability:

int get_int(void* value){
    return *((int*) value);
}

long get_long(void* value){
    return *((long*) value);
}

then in your code:

 int c =  get_int(args0[0]);

 long d = get_long(args0[1]);

That should work.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜