具有指针的基于数组的堆栈的C程序

时间:2018-09-19 17:18:18

标签: c arrays function pointers stack

这是我的代码,无法正常工作。有任何想法吗?我不能根据给定的分配更改主要功能或任何功能名称或参数,我只能更改功能的内容。我太困了。任何帮助表示赞赏。我已经在push函数上运行了GDB,它似乎运行得很好。但是,打印堆栈函数认为数组的长度为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 :(得分:0)

您有未定义的行为,因为

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

arrmakestack的局部变量,一旦控件退出makestack,它将被销毁。因此,您将指的是无效的内存。

因此将makestack更改为以下内容。

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

注意:Typedefing指针是错误的,避免使用它。

  typedef int *stack; //bad