C内存管理 - >队列

时间:2015-01-03 00:57:25

标签: c algorithm memory segmentation-fault

好的,所以我有这个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子句,并继续引导我分段错误。

没有最后三行,代码编译并运行,没有错误。但随着这一点,我只是不断收到分段错误。

有人知道这个问题吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

因为这个

你的分段错误
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. 您确实有内存泄漏,但这不是导致分段错误的原因,您应该在free(teste)末尾调用main()
  5. main()
  6. 之后,您return 0;不会返回,main()结尾处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; }

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

    {{1}}