在C中,我尝试学习队列数据结构并制作指向结构的指针,但在结构内部有指向数组的指针。这里queue
是struct,q
是指向struct的指针,struct内部有rear
、front
、num
和 int *que
(指向存储数据的数组的指针)
typedef struct {
int max;
int rear;
int front;
int num;
int *que;
} queue;
和malloc()
使用
queue->que=malloc(sizeof(int)12) ; to make arrray And to access it,
q->que[q->rear++] //not to familiar,
首先,我没有声明数组,但我可以使用 []
访问 que
指向的数据吗?
这是否意味着访问 q
指针内的 que[q->rear++]
?
这与 (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))
部分,然后将this值与NULL
进行比较通过 ==
运算符。如果条件为假,则结果为 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 .
关于c - 使用指向数组的结构体进行队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46782067/