Вы должны решить, что именно вы пытаетесь сделать в этом случае.
(1) Если вы хотите использовать массив void *
для хранения int
значений ( фактическое int
, принудительно преобразованное в void *
)затем вы должны добавить эти int
значения в массив следующим образом
int a = 1234;
array_pt array = array_new(1);
array_add(array, (void *) a);
и затем получить их обратно из массива следующим образом
int a = (int) array_get(array, 0);
printf ("%d\n", a);
или просто
printf ("%d\n", (int) array_get(array, 0)));
Эта последняя часть - именно то, что вы сделали, но вы ошиблись в первой части.
Это основанный на касте подход, который во многих отношениях безобразен, но имеет определенную практическую ценность и будетработа при условии, что void *
достаточно велика, чтобы вместить int
.Этот подход может зависеть от свойств 32- и 64-разрядных систем.
(2) Если вы хотите использовать массив void *
для хранения значений int *
(указывает на int
), затем вы должны добавить эти int
значения в массив следующим образом
int a = 1234;
array_pt array = array_new(1);
array_add(array, &a);
и затем вернуть их из массива следующим образом
int *pa = array_get(array, 0);
printf ("%d\n", *pa);
илипросто
printf ("%d\n", *(int *) array_get(array, 0));
Этот подход совершенно безопасен от любых проблем с переносимостью.У него нет 32- или 64-битных проблем.Указатель void *
гарантированно надежно удерживает указатель int *
или любой другой указатель данных.
Если это было вашим намерением, то вы правильно поняли первую часть, а последнюю - неправильно.
Или то или это.Ваш код кажется странным сочетанием двух, поэтому он не работает, и поэтому из исходного сообщения невозможно определить, какой подход вы пытались использовать.