c - 使用指向数组的结构体进行队列

标签 c segmentation-fault queue

在C中,我尝试学习队列数据结构并制作指向结构的指针,但在结构内部有指向数组的指针。这里queue是struct,q是指向struct的指针,struct内部有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 指向的数据吗? 这是否意味着访问 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

现在这个(01)值被分配给q->que而不是malloc() 的返回值。所以底线是 q->que 指向内存位置 0 (或 1 视情况而定),这很可能不是正常程序允许扰乱的内存部分,因此会出现错误。

您可以通过使用括号来解决此运算符优先级问题

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

main() 内的 while 循环中,控制表达式为 m!=0m > 在第一次迭代期间甚至没有初始化。此时,其值是不确定的(垃圾值)。

您可以首先将 m 初始化为 0 以外的内容,例如

int m=1,x;
while (m != 0) {

在 C 语言中,您无需转换 malloc() 返回的值。请参阅here .

关于c - 使用指向数组的结构体进行队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46782067/

相关文章:

c - 什么函数实际调用 WinMain

c++ - C/C++ 新手使用 Android NDK 移植 Legacy 代码,出现编译错误

c - 优化的字节数组移位器

python - 需要验证 : Clearable Python Queue class

c - 这个FFT函数的输出有什么意义呢?

c++ - 奇怪的段错误

c - 分配 struct = struct 时出现段错误

swift - Swift 中使用协议(protocol)的通用观察者模式会导致段错误

c - 这两个中断服务程序中的竞争条件是什么?

c++ - C++中的无等待队列实现