¿Cómo convierto de void * back a int

si tengo

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; 

¿Cómo puedo convertir de args [0] y args0 [1] a int y long? por ejemplo

 int c=(something im missing)args0[0] long d=(something im missing)args1[0] 

Suponiendo que se supone que & a0 y & b0 son & a y & b, y que quiere decir args0 [1] para configurar d largo, ha almacenado un puntero a a en args0 [0] y un puntero a b en args0 [1] . Esto significa que necesita convertirlos a los tipos de punteros correctos.

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

Para responder literalmente a tu pregunta, escribirías

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

Lo que me preocupa de su código es que ha asignado espacio para los punteros a sus ubicaciones, pero no ha asignado memoria para los valores en sí. Si espera persistir estas ubicaciones más allá del scope local, debe hacer algo como:

 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; 

Prueba esto:

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

Debe decirle que el vacío * debe interpretarse como int * o long * cuando no lo haga.

 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]; 

Mientras que otros han respondido a su pregunta, haré un comentario sobre las últimas tres líneas en la primera parte de su fragmento de código:

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

Lo anterior está mejor escrito como:

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

La llamada a malloc() es más fácil de leer de esta manera, y menos propensa a errores. No necesita un lanzamiento en las dos últimas declaraciones, ya que C garantiza las conversiones hacia y desde un puntero de objeto y un puntero de vacío.

Si estás probando, sugiero que se use una función externa, para obtener más legibilidad:

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

entonces en tu código:

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

Eso debería funcionar.