C 内存管理 -> 队列

C Memory Management -> Queue

好吧,我有这个可以工作的 Queue 实现,但我有一些内存泄漏,不允许 if else 操作在此之后运行。

文件queue_arr.h

#define MaxQ 100

typedef struct {
    int array[MaxQ];
    int front;
    int back;
    int size;
}*Queue;


Queue init();
int enqueue(Queue q, int v);
int dequeue(Queue q, int *v);
int front(Queue q, int *v);
int isEmpty(Queue q);

文件queue_arr.c

#include "queue_arr.h"
#include <stdlib.h>
#include <stdio.h>


Queue init() {
    Queue q = (Queue)malloc(sizeof(Queue));
    q->front = 0;
    q->back = 0;
    q->size = 0;
    return q;
}

int enqueue(Queue q, int v) {
    if(q->size==MaxQ)
        return 0;
    q->array[q->back] = v;
    q->back++;
    if(q->back == MaxQ)
        q->back = 0;
    q->size++;
    return 1;

}

int dequeue(Queue q, int *v) {
    if(q->size == 0)
        return 0;
    *v = q->array[q->front];
    q->front++;
    if(q->front == MaxQ)
        q->front =0;
    q->size--;
    return 1;   
}

int front(Queue q, int *v) {
    if(q->size==0)
        return 0;
    *v = q->array[q->front];
    return 1;   
}

int isEmpty(Queue q) {
    if(q->size == 0)
        return 1;
    return 0;
}

int main(){
    Queue teste = init();
    int *aux;
    *aux = -1;
    printf("Value : %d\n",*aux );

    enqueue(teste,5);
    enqueue(teste,10);
    enqueue(teste,15);
    front(teste,aux);

    printf("Next costumer: %d\n",*aux );

    dequeue(teste,aux);

    printf("Costumer %d left queue\n",*aux );

    dequeue(teste,aux);

    printf("Costumer %d left queue\n",*aux );

    dequeue(teste,aux);

    printf("Costume %d left queue\n",*aux );

    int random = 10;
    if(random == 10)
        printf("asdasdasd\n");


}

最后一个 if 和 else 语句不起作用,我注意到因为我试图做一个 isEmpty if 子句,并一直导致我出现分段错误。

没有最后三行,代码编译运行,没有错误。但是这样我就一直遇到分段错误。

有人知道这个问题吗?

Queue q = (Queue)malloc(sizeof(Queue)); 

恭喜,sizeof(Queue) 是 4(或 8)个字节,因为它是一个指针。

你的分段错误因此

int *aux;

*aux = -1;

你应该

aux = malloc(sizeof(int));

之前

*aux = -1;

但我认为这不是你想要的,相反你应该这样做

int aux = -1;

并且在调用 dequeue

dequeue(teste, &aux);

此外,我建议您解决这些其他问题

  1. 你不需要施法malloc
  2. 你应该检查 malloc 没有 return NULL 否则你将取消引用一个 NULL 未定义行为的指针。
  3. 此外,您的 malloc 调用传递了错误的大小。一个可能的解决方法是使用

    Queue q = malloc(sizeof(*q));
    

    但我实际上建议避免完全隐藏变量是指针的事实。

  4. 您确实有内存泄漏,但这不是分段错误的原因,您应该在 main() 结束时调用 free(teste)
  5. 你的 main() 不 return 你应该在 free()
  6. 之后的 main() 末尾添加 return 0;

我修改了你的代码,希望这对你有帮助

#include <stdlib.h>
#include <stdio.h>

#define MaxQ 100

typedef {
    int array[MaxQ];
    int front;
    int back;
    int size;
} *Queue;


Queue init() {
    Queue q = malloc(sizeof(*q));
    if (q == NULL)
        return NULL;
    q->front = 0;
    q->back = 0;
    q->size = 0;
    return q;
}

int enqueue(Queue q, int v) { 
    if (q == NULL)
        return 0;
    if(q->size==MaxQ)
        return 0;
    q->array[q->back] = v;
    q->back++;
    if(q->back == MaxQ)
        q->back = 0;
    q->size++;
    return 1;

}

int dequeue(Queue q, int *v) {
    if (q == NULL)
        return 0;
    if(q->size == 0)
        return 0;
    *v = q->array[q->front];
    q->front++;
    if(q->front == MaxQ)
        q->front =0;
    q->size--;
    return 1;
}

int front(Queue q, int *v) {
    if (q == NULL)
        return 0;
    if(q->size==0)
        return 0;
    *v = q->array[q->front];
    return 1;
}

int isEmpty(Queue q) {
    if (q == NULL)
        return 0;
    if(q->size == 0)
        return 1;
    return 0;
}

int main(){
    Queue teste = init();
    if (teste == NULL)
        return -1;
    int aux;

    aux = -1;
    printf("Value : %d\n", aux);

    enqueue(teste,5);
    enqueue(teste,10);
    enqueue(teste,15);
    front(teste, &aux);

    printf("Next costumer: %d\n", aux );

    dequeue(teste, &aux);

    printf("Costumer %d left queue\n", aux );

    dequeue(teste, &aux);

    printf("Costumer %d left queue\n", aux );

    dequeue(teste, &aux);

    printf("Costume %d left queue\n", aux );

    int random = 10;
    if(random == 10)
        printf("asdasdasd\n");
    free(teste);

    return 0;
}

您的代码无法确定 Queue 是指向某物还是某物的指针。

typedef struct {
    int array[MaxQ];
    int front;
    int back;
    int size;
}*Queue;

这表示 Queue 是指向一堆东西的指针。

Queue q = (Queue)malloc(sizeof(Queue));
q->front = 0;

这会分配足够的字节来容纳 Queue,这只是一个指针,然后尝试使用它指向的东西。但是除了指针之外,您从未为任何东西分配 space。