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

#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就能运行呢

阅读 2k
4 个回答
 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 周年「问答」打卡 ,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题