使用指向数组的结构的队列
问题描述:
在C中,我尝试学习队列数据结构并将指针指向结构,但在结构内部存在指向数组的指针。这里queue
是结构,q
是指向struct和内部结构有rear
,front
,num
和int *que
使用使用指向数组的结构的队列
queue->que=malloc(sizeof(int)12) ; to make arrray And to access it,
q->que[q->rear++] //not to familiar,
优先(指针数组来存储数据)
typedef struct {
int max;
int rear;
int front;
int num;
int *que;
} queue;
而且malloc()
我没有声明数组,但我可以使用[]
访问que
指向的数据吗? 这是指里面q
指针吗? 这和(q).que[q->rear++]
一样吗?我得到了分段错误。
部分代码;但也有一些错误
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int max;
int num;
int front;
int rear;
int *que;
} queue;
int initialization(queue*q, int max) {
q->num = 0;
q->front = 0;
q->rear = 0;
if (q->que =(int*)malloc(max * sizeof(int)) == NULL) { // got pointer NULL i dont know why
q->max = 0;
return-1;
}
q->max=max;
return 0;
}
int main() {
queue que;
if (initialization(&que, 12) == -1)
printf("fail");
else {
int m,x;
while (m != 0) {
printf("1.enque 2.deque. 3.peek 4.display 0. slese");
scanf("%d", &m);
switch (m) {
case 0: break;
case 1: printf("data");
scanf("%d", &x);
enqueue(&que, x);
break;
case 2: dequeue(&que, &x);
printf("%d is dequeue", x);
break;
case 3:x=peek(&que,&x);
printf("max now is %d", x);
break;
case 4:display(&que);
}
}
}
int enqueue(queue*q, int x) {
if (q->num >= q->max)
return -1;
else{
q->num++;
q->que[q->rear++]= x; //got segmentation fault
if (q->rear == q->max)
q->rear = 0;
}
}
答
在你initialization()
功能,同时分配内存malloc()
像
if (q->que =(int*)malloc(max * sizeof(int)) == NULL) {
的(int*)malloc(max * sizeof(int))
部分首先通过==
运营商评估,然后这个值进行比较反对NULL
。如果条件为false,则将导致0
,否则将导致1
。
现在此(0
或1
)的值被分配给q->que
代替malloc()
返回值。因此,底线是q->que
指向内存位置0
(或根据情况可能为1
),这很可能不是内存的一部分,正常程序可能会混淆,因此会出错。
您可以通过使用括号像
if ((q->que = malloc(max * sizeof(int))) == NULL) {
解决这个运算符优先级问题,并在里面main()
你while
回路,控制表情是m!=0
但m
不是第一次迭代时甚至初始化。在那个时候,它的值是不确定的(垃圾值)。
你可以初始化m
比0
其他的东西像第一
int m=1,x;
while (m != 0) {
而在C,你不必投用malloc()
返回的值。见here。
把'#include' –
BLUEPIXY
首先,请用正常的缩进格式化你的代码;没有它你的代码*非常*难以阅读。其次,'if(q-> que =(int *)malloc(max * sizeof(int))== NULL)'由于运算符优先级而没有做你想做的事情;这实际上是'q =(malloc()== NULL)',所以'q'结束为0或1.你想'if((q = malloc())== NULL)'代替。哦,请不要忽略编译器警告 - 例如,'m'在使用之前不会被初始化。解决所有这些问题,然后看看程序是如何工作的。 –
@Ken Y-N感谢它的工作!而不是'int * que'和malloc来创建数组,我可以只声明'int que [12]'这样的数组并且使用'q-> que []'来访问数据吗?并且如果我写'*(int)malloc(sizeof(int * 12)'我是否也需要强制转换?并且对于运算符优先级 - >和[]是相同的,它将从左到右顺序。 > que'会先评估,然后[],我是对吗? – fiksx