Вот два способа решения проблемы. Один из них переносимый, а другой менее переносимый.
Первое решение заключается в динамическом выделении пространства для значения int
в очереди:
for (i = 0; i < 5; i++) {
int *val = malloc(sizeof(*val));
*val = i;
enqueue (q, val);
}
. Для любого кода требуется значение int
. разыменуйте указатель:
int val = *(int *)dataptr;
Некоторый фрагмент кода должен освободить память, чтобы избежать утечек памяти.
Второе решение является хитрым и менее переносимым и включает использование void *
для хранить целое число вместо указателя на объект:
for (i = 0; i < 5; i++) {
enqueue (q, (void *)i);
}
Независимо от кода, необходимого для значения int
, потребуется преобразовать значение указателя обратно в int
:
int val = (int)dataptr;
Вы можете получить некоторые предупреждения компилятора. Может быть лучше заменить int
на intptr_t
.
Подлое решение основано на преобразовании туда-обратно int
в void *
и обратно в int
(или из intptr_t
в void *
и обратно intptr_t
) с сохранением исходного значения, что не гарантируется стандартом C, поэтому оно не так переносимо, как первое решение, использующее динамически выделяемое хранилище.
Of Конечно, если вам действительно нужно поставить в очередь только небольшое фиксированное число int
с, вы можете выделить их как массив и поставить в очередь указатель на отдельный элемент в каждой итерации:
int vals[5];
for (i = 0; i < 5; i++) {
vals[i] = i;
enqueue (q, &vals[i]);
}
Независимо от того, что нужно коду значение int
может разыменовать указатель:
int val = *(int *)dataptr;