Помните, что все параметры передаются по значению в C.
Когда вы передаете указатель в качестве параметра функции, вы можете получить доступ к объекту (или массиву объектов), на который указывает этот указатель.
Вашему create_stack()
передается указатель на struct Stack
, то есть параметр s
. Затем игнорирует исходное значение s
и переназначает его. Это разрешено, но обратите внимание, что не изменяет исходный указатель в вызывающей стороне create_stack()
, поскольку параметры функции передаются по значению .
Существует дваспособы сделать то, что вы хотите.
Первый способ - передать указатель на указатель:
_Bool create_stack(STACK *s){
*s = malloc(sizeof(struct Stack));
if(*s == NULL )
return 0;
(*s)->tos = 0;
return 1;
}
Назовите его, например:
STACK mystack;
_Bool ret;
ret = create_stack(&mystack);
if (!ret) {
/* error */
}
Второй способэто ничего не передавать и возвращать указатель на выделенный стек:
STACK create_stack(void){
STACK s = malloc(sizeof(struct Stack));
if(s != NULL ) {
s->tos = 0;
}
return s;
}
Назовите его, например:
STACK s;
s = create_stack();
if (s == NULL) {
/* error */
}
Наконец, как точка стиля программирования, не typedef
указатели, как вы сделали. Будет понятнее, если указатель будет явным, например, использовать typedef struct Stack STACK;
вместо typedef struct Stack *STACK;
и соответственно скорректировать использование, например, заменив STACK s
на STACK *s
и заменив STACK *s
на STACK **s
.