Как мне конвертировать из void * обратно в int - PullRequest
15 голосов
/ 08 июля 2010

если у меня есть

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]

Ответы [ 6 ]

16 голосов
/ 08 июля 2010

Предполагая, что ваши & 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 голосов
/ 08 июля 2010

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

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;
0 голосов
/ 28 мая 2018

Если вы тестируете, я предлагаю использовать его как внешнюю функцию, чтобы улучшить читаемость:

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

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

тогда в вашем коде:

 int c =  get_int(args0[0]);

 long d = get_long(args0[1]);

Это должно сработать.

0 голосов
/ 09 июля 2010

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

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.

0 голосов
/ 08 июля 2010

Вы должны сказать ему, что 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];
0 голосов
/ 08 июля 2010

Попробуйте это:

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

 long d = *( (long *) args0[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...