当前位置:优学网  >  在线题库

这该怎么解释呢?求解答。

发表时间:2022-05-18 10:02:44 阅读:56
#include<stdio.h>
#include<stdlib.h>
typedef int QueueType;
typedef struct Queue {
 int front;
 int rear;
 int queueSize;
 QueueType* base;
}Queue;

//初始化
void InitQueue(Queue* q,int QueueSize) {
 q->base = (QueueType*)malloc(QueueSize*sizeof(QueueType));
 if (q->base == NULL) {
  return;
 }
 q->front = 0;
 q->rear = 0;
 q->queueSize = QueueSize;

}

int main(void) {
 Queue* q;
 int size = 10;
 InitQueue(&q, size);
}

这样初始化一个循环队列,而在主函数里为什么Queue* q程序崩溃,而Queue q就能运行呢

🎖️ 优质答案
  •  int main(void) {
    - Queue* q;
    + Queue *q = (Queue *)malloc(sizeof(Queue));
  • 你出错的原因是*q 没有正确初始化,你应该初始化后再处理。正确的完整调用方法是:

    Queue* q = (Queue *)malloc(sizeof(Queue));// 这里声明并且初始化了q,后面就可以:
    int size = 10;
    InitQueue(q, size); // 这里q前面不用加&的

    Queue q ;// 注意这里q前面没有了*,表示不是指针,而是一个实体啦,这同时就申请了内存空间的。
    int size = 10;
    InitQueue(&q, size); // 这里q前面必须加&的
  • Queue* q后面加一个malloc函数,使其初始化,就正确了,总的来说代码写的很棒,继续加油

    所以,正确代码为:

    #include<stdio.h>
    #include<stdlib.h>
    typedef int QueueType;
    typedef struct Queue {
     int front;
     int rear;
     int queueSize;
     QueueType* base;
    }Queue;
    
    //初始化
    void InitQueue(Queue* q,int QueueSize) {
     q->base = (QueueType*)malloc(QueueSize*sizeof(QueueType));
     if (q->base == NULL) {
      return;
     }
     q->front = 0;
     q->rear = 0;
     q->queueSize = QueueSize;
    
    }
    
    int main(void) {
     Queue *q = (Queue *)malloc(sizeof(Queue));
     int size = 10;
     InitQueue(&q, size);
    }

    已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

  • 声明了一个指针,但是没有给他实际分配空间,所以会崩溃。打个比方,给你把钥匙,让你去开 260 号柜放东西,结果你去一看,260 号位置只画了个框,根本没做柜子。当然实际的情况更像是 260 号还放着别人的东西,你把你的东西放进去,把别人的东西干掉了,结果别人来取的时候就崩溃了。

    Queue q 是声明的实体,是分配了空间并进行初始化之后的结构体数据,是可用的。


    已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

  • 相关问题