Этот код неверен:
STACK *snew;
snew = (STACK *) malloc (siz + 1);
memcpy (snew->s, a, siz);
snew->s
не инициализируется, когда вы memcpy a
в него. Я ожидаю увидеть два malloc
с - один для STACK*
, а другой для STD*
, который вы затем использовали бы для заполнения snew->s
перед копированием в него содержимого.
STACK *snew;
snew = (STACK *) malloc (sizeof(STACK));
snew->s = (STD*) malloc(sizeof(STD));
memcpy (snew->s, a, siz);
В качестве альтернативы вы можете использовать один malloc
и указать snew->s
на соответствующее смещение внутри него (после того, как вы оставили место для STACK struct
).
STACK *snew;
snew = (STACK *) malloc (sizeof(STACK) + siz + 1);
snew->s = (char*)snew + sizeof(STACK);
memcpy (snew->s, a, siz);
Параметр siz
в вашей функции push
кажется излишним, поскольку вы всегда передаете struct STD
.