Вы всегда должны передавать указатель void. Это означает, что если вы хотите передать простое значение, такое как 1, вам нужно выделить целочисленное значение и передать на него указатель (как пустой указатель).
Таким образом, что-то вроде:
int x = 4;
upo_stack_push(upo_stack, &x);
Конечно, вы должны убедиться, что переменная int x не выходит из области видимости, иначе указатель укажет на свободную память, что приведет к неприятным проблемам с памятью.
Обновление
Предполагается, что указатель void, который вы передаете, уже хранится в памяти для области видимости стека. В случае, если вы хотите, чтобы сам стек копировал данные, вы также должны использовать для этого пространство malloc, таким образом не только неправильно блокируя узел, но также блокируя и копируя передаваемый тип данных. Также, чтобы узнать размер данных (поскольку это пустой указатель, который не знает о его типе), вы должны добавить параметр размера int в функцию push.
Чтобы сохранить целочисленное значение, передайте его как указатель с size: sizeof (int). Чем для копирования структуры данных, используйте memcpy. Это работает только для простых типов и структур без указателей. Если вам нужно копировать структуры с помощью указателей (таким образом, вам нужно так называемое глубокое копирование), то это сложнее.