使用指向数组的struct的队列

时间:2017-10-17 03:34:12

标签: c segmentation-fault queue

在C中,我尝试学习队列数据结构并指向struct,但在struct中有指向数组的指针。这里queue是struct,q是结构的指针,而内部结构中有rearfrontnumint *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;
    }
}

1 个答案:

答案 0 :(得分:0)

initialization()功能中,使用malloc()分配内存

if (q->que =(int*)malloc(max * sizeof(int)) == NULL) {

首先评估(int*)malloc(max * sizeof(int))部分,然后通过NULL运算符将值与==进行比较。如果条件为假,这将导致0,否则将导致1

现在01)值已分配给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