关于#访问冲突#的问题,如何解决?

ex4_3:——扩展题(必做)
1)两个栈共用一个数组空间,它们的栈底分别在数组两端,栈顶相向而行。编写入栈和出栈函数,实现两个栈元素分别的(但共用)入栈和出栈。
2)main中函数完成以下测试:
a、能否在共用空间上实现两个独立的栈:即能否向两个栈分别输入元素;能否分别从两个栈取出元素,每个栈取出的元素的顺序符合各自栈的特点
b、能否在共用空间用满时,及时制止新的入栈行为。
例如:
假设数组大小为6,main函数实现以下动作,向栈1接连入栈4个元素后,向栈2入栈2个元素致栈满,再向栈2输入一个元素,将报错。接着从栈1出栈1个元素,再向栈2入栈,就会成功。最后,两个栈分别出空,观察输出顺序是否满足栈的特点。

#include
#include
#define N 5
#define true 1
#define false 0

typedef struct
{
    int data[N];
    int front,rear;
    int flag;
}node;


node* initial(node* q)
{
    
    q = (node*)malloc(sizeof(node));
    if (q == NULL) return 0;
    q->front=q->rear=q->flag = 0;
    return q;
}


node* enter(node *p, int x) //入队列函数
{
    if (p->rear == p->front && p->flag == 1)
    {
        printf("队列已满\n");
        return (false);
    }
    else
    {
        p->data[p->rear] = x;
        p->rear = (p->rear + 1) % N;
        return p;
    }
}

int out(node* t) //出队列函数
{
    int x;
    if (t->rear == 0&&t->front==0 && t->flag == 0)
    {
        printf("该队列不存在");
        return (false);
    }
    else 
    {
        x = t->data[t->front];
        t->front = (t->front + 1) % N;
    }
    return x;
}

int main()
{
    node *p;
    p=initial(&p);
    int i, x=1,flagmain = 0,n;
    p->front = p->rear =p->flag = 0;
    while (1)
    {
        printf("请输入你想进行的操作:输入1进行enter、输入2进行out\n");
        scanf_s("%d", &n);
        switch (n)
        {
            case 1:
            {
                if (flagmain >= 5)
                {
                    printf("你不能操作enter功能!\n\n");
                    break;
                }
                printf("请输入数字并输入0来结束(0不计入队列中):\n");
                scanf_s("%d", &x);
                while (x != 0)
                {
                    p=enter(p, x);
                    flagmain++;        
                    if (flagmain == 5)  p->flag = 1;
                    scanf_s("%d", &x);
                }
                break;
            }
            case 2:
            {
                printf("请输入你想从队列中out多少数:\n");
                scanf_s("%d", &x);
                for (i = 0; i < x; i++)
                {
                    out(&p);
                    flagmain--;
                }
                if (flagmain == 5)
                p->flag = 0;    
                break;
            }
        }
    }
    return 0;
}

0x00007FF6F6AF1CFA 处(位于 Project2.exe 中)引发的异常: 0xC0000005: 读取位置 0x000000A7A5A32F78 时发生访问冲突。

img

不知道怎么解决

node *initial(node *q)  你代码中这里传q没意义,可改为node *initial(),
调用的p=initial(&p),需要函数参数类型为node**,这样才能在函数中改变变量的指向。也不需要返回。
后面的out(&p),同理,不需要加&。