Подтвердить что ты не робот

Как преобразовать из void * back to int

если у меня

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;

как я могу конвертировать из args [0] и args0 [1] обратно в int и long? например

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

Ответ 1

Предполагая, что ваши & a0 и & b0 должны быть & a и & b и что вы имеете в виду args0 [1] для установки long d, вы сохранили указатель на a в args0 [0 ] и указатель на b в args0 [1]. Это означает, что вам нужно преобразовать их в нужные типы указателей.

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

Ответ 2

Чтобы буквально ответить на ваш вопрос, вы должны написать

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

Что может повлиять на ваш код, так это то, что вы выделили место для указателей на свои местоположения, но вы не выделили память для самих значений. Если вы ожидаете, что эти местоположения выйдут за пределы локального масштаба, вам нужно сделать что-то вроде:

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;

Ответ 3

Попробуйте следующее:

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

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

Ответ 4

Вам нужно сказать, что void * следует интерпретировать как int * или long * при разыменовании.

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

Ответ 5

Пока другие ответили на ваш вопрос, я сделаю комментарий о последних трех строках в первой части фрагмента кода:

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

Вышеуказанное лучше писать как:

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

Вызов malloc() легче читать таким образом и меньше подвержен ошибкам. Вам не нужно делать броски в последних двух утверждениях, так как C гарантирует конверсии с указателем на объект и указателем void.