【问题标题】:C Memory Management -> QueueC 内存管理 -> 队列
【发布时间】:2015-01-03 00:57:25
【问题描述】:

好的,所以我有这个可行的队列实现,但是我有一些内存泄漏,不允许 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 子句,并一直导致我出现分段错误。

没有最后三行,代码编译并运行,没有错误。但这样一来,我就会不断遇到分段错误。

有人知道这个问题吗?

【问题讨论】:

  • 由于这是有效的 c++ 我不能随意删除 c++ 标签,请选择 c 或 c++ 一个
  • 谢谢你,即使你根本没有帮助。
  • Queue q = (Queue)malloc(sizeof(Queue)); --> Queue q = (Queue)malloc(sizeof(*q));

标签: c algorithm memory segmentation-fault


【解决方案1】:

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

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

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

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

这分配了足够的字节来保存Queue,它只是一个指针,然后尝试使用它指向的东西。但是你从来没有为指针分配空间。

【讨论】:

  • 你可能是对的,不是在争论。但我在队列函数上没有内存问题。而且我还尝试了另一种实现,使用队列的结构和 *Queue 的 typedef(使用指针),所以我可以以正确的方式分配空间,即使 iharob 答案是我需要的。
  • @Duozhasht 想想看。您在哪里为q-&gt;front 分配空间?您为Queue 本身分配空间,但这是一个指针。
  • 那么如何正确分配它呢?改变结构本身或我分配空间的方式?
  • @Duozhasht Queue q = malloc (sizeof (*Queue));Queue 指向的东西分配足够的空间。
【解决方案2】:
Queue q = (Queue)malloc(sizeof(Queue)); 

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

【讨论】:

    【解决方案3】:

    因此您的分段错误

    int *aux;
    
    *aux = -1;
    

    你应该

    aux = malloc(sizeof(int));
    

    之前

    *aux = -1;
    

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

    int aux = -1;
    

    当调用dequeue

    dequeue(teste, &aux);
    

    另外我会建议你解决这些其他问题

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

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

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

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

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

    #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;
    }
    

    【讨论】:

    • 再次感谢您,您完全做到了。对不起,我不能投票,但你的回答是迄今为止最好的。只有你能回答真正的问题,其余的解释也是一个很好的帮助。
    • 我知道你不能投票,但你可以accept 回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2018-12-17
    • 2014-10-24
    相关资源
    最近更新 更多