好的,所以我有这个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子句,并继续引导我分段错误。
没有最后三行,代码编译并运行,没有错误。但随着这一点,我只是不断收到分段错误。
有人知道这个问题吗?
答案 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);
另外,我建议你修复这些其他问题
malloc
malloc
是否未返回NULL
,否则您将取消引用
NULL
指针是未定义的行为。此外,您的malloc
来电传递错误。可能的解决方法是使用
Queue q = malloc(sizeof(*q));
但我实际上建议避免隐藏变量完全是指针这一事实。
free(teste)
末尾调用main()
。main()
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}}