Либо (как другие ответы предполагают) выделить зону памяти и получить указатель на stack_t
в куче и инициализировать ее правильно (возможно, через в create_empty_stack
функции) или объявить stack_t
local variable (на call stack), инициализировать его в явном виде, и передать указатель на него:
stack_t locstack = {.data={}, .top=0};
push(&locstack, 2);
BTW, так как прокомментировал Jonathan Leffler, код не является стандартом C99 или C11, потому что nested functions не разрешены в стандартном C. Вы (возможно, неправильно) используете GCC extension. Вы должны определить функцию push
вне (и до) main
. Если вы заботитесь об эффективности, определите его как static inline void push(stack_t *stack, int n)
.... чтобы получить его inlined.
Обратите внимание, что если вы хотите принять сколь угодно размера стека, следует использовать некоторые flexible array member и вырастить их (раз в то время) по мере необходимости (думать о какой-то int newsize = 4*stack->size/3+2;
когда стек становится полным, то
stack_t*newstack = malloc(sizeof(stack_t)+newsize*sizeof(int));
и т.д ....) и только использование heap allocated указатели, вы можете рассмотреть как top
, так и size
в качестве полей stack_t
и имеют data[]
в качестве своего последнего (последнего) flexible array member. В этом случае push
, вероятно, вернет (возможно, обновленный) указатель.
BTW, как только вы используете некоторые выделения динамической памяти, как malloc, вы всегда должны справляться с неудачами, по крайней мере, как:
stack_t* pstack = malloc(sizeof(stack_t));
if (pstack==NULL) { perror("malloc"); exit(EXIT_FAILURE); };
(если у вас есть какое-то При использовании GCC, прочитайте подробнее о его command options (их порядок важен). Я рекомендую компиляцию с gcc -std=c99 -Wall -Wextra -g
(на ваш исходный код, который должен дать некоторые полезные диагностические данные), улучшите свой код, пока не получите никаких предупреждений, а затем используйте отладчик gdb
.
Что с вложенной функцией thingy? У вас должна быть функция 'push()', определенная вне 'main()'. Только GCC в вялом режиме допускает вложенные функции - они не переносятся и вообще злобны, и вы не должны их использовать, если вы изучаете C (и, вероятно, не используете даже после того, как вы научились C). –