tags:

views:

128

answers:

6

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 missing)args0[0]
long d=(something im missing)args1[0]
+3  A: 

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]);
Arthur Shipkowski
A: 

Try this:

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

 long d = *( (long *) args0[1]);
bits
int c=*((int )args0[0]);causes error: invalid type argument of 'unary *' (have 'int')and int c=((int *)args0[0]);fprintf(stderr,"main(): %d \n",c);causes the output to be -4261808
w31
I don't get it. What is the difference between my answer and the one on the top (which is accepted)?
bits
@bits: When you first posted, the "*" was missing after 'int' for some reason, perhaps due to it being interpreted as formatting -- see w31's comment for how it looked.
Arthur Shipkowski
A: 

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];
Maister
+2  A: 

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;
Keith Morgan
A: 

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 about 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.

Alok
A: 
sizeof(void *)

won't work. The compiler doesn't know the size. void is by definition not defined so the size is unknown.

Jay
The compiler knows the size of (void *) -- it's a standard pointer, and if the compiler didn't know, how would it reserve room for a local void * off the stack? What the compiler doesn't know is sizeof(void).
Arthur Shipkowski
Sorry, read that as sizeof(*void). DOH!
Jay