C-программа со стеком на основе массива с использованием указателей - PullRequest
0 голосов
/ 19 сентября 2018

Это мой код, и он не работает.Есть идеи?Я не могу изменить основную функцию или любое из названий функций или параметров на основе данного назначения, я могу только изменить содержание функций.Я супер застрял.Любая помощь приветствуется.Я запустил GDB для функции push, и она, кажется, работает отлично.Однако функция стека печати считает, что длина массива равна 0, что совершенно бесполезно.Большое спасибо!

typedef int *stack;

void push (stack st, int num)
{
        int len = st[0];
        st[len+1]=num;
        st[0]++;

}
int pop(stack st)
{
        int len = st[0], x;
        x = st[len];
        st[0]--;
        return x;
}
void printstack(stack st)
{
        int i, len= st[0];
        for(i=1;i<=len;i++)
        {
                printf("%d ", st[i]);
        }

}
stack makestack()
{
        stack n;
        int arr[20];
        n = malloc(sizeof(stack));
        arr[0]=0;
        n= arr;
        return n;
}
int main()
{
 stack s;
 stack t;
 s = makestack();
 t = makestack();

 int x;
 push(s, 4);
 push(s, 6);
 push(t, 7);
 push(t, 5);
 printstack(s);
 printstack(t);
 x = pop(s);
 printf("%d popped from s\n", x);
 printstack(s);
 printstack(t);
}

1 Ответ

0 голосов
/ 19 сентября 2018

У вас неопределенное поведение, потому что

stack n;
int arr[20];
n = malloc(sizeof(stack));
arr[0]=0;
n= arr;
return n;

arr является локальной переменной makestack и будет уничтожено после выхода из управления makestack.Следовательно, вы будете ссылаться на недопустимую память в дальнейшем.

Таким образом, измените makestack на, как показано ниже.

    stack makestack()
    {
            stack n = malloc(sizeof(int)*20);
            n[0]=0;
            return n;
    }

Примечание: определение типа указателя является ошибочным, избегайте его.

  typedef int *stack; //bad
...