在C中,我尝试学习队列数据结构并指向struct,但在struct中有指向数组的指针。这里queue
是struct,q
是结构的指针,而内部结构中有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
访问[]
指向的数据吗?
这是que[q->rear++]
指针内的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;
}
}
答案 0 :(得分:0)
在initialization()
功能中,使用malloc()
分配内存
if (q->que =(int*)malloc(max * sizeof(int)) == NULL) {
首先评估(int*)malloc(max * sizeof(int))
部分,然后通过NULL
运算符将此值与==
进行比较。如果条件为假,这将导致0
,否则将导致1
。
现在此(0
或1
)值已分配给q->que
,而不是malloc()
的返回值。所以底线是q->que
指向内存位置0
(或1
视情况而定),这很可能不是正常程序被允许弄乱的内存的一部分因而你会得到错误。
您可以使用括号(如
)解决此运算符优先级问题if ((q->que = malloc(max * sizeof(int))) == NULL) {
在while
内的main()
循环中,控件表达式为m!=0
,但m
在第一次迭代期间甚至未初始化。此时,它的值是不确定的(垃圾值)。
您可以先将m
初始化为0
以外的其他内容,例如
int m=1,x;
while (m != 0) {
在C中,您无需转换malloc()
返回的值。请参阅here。