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);
此外,我建议您解决这些其他问题
- 你不需要施法
malloc
- 你应该检查
malloc
没有 return NULL
否则你将取消引用一个
NULL
未定义行为的指针。
此外,您的 malloc
调用传递了错误的大小。一个可能的解决方法是使用
Queue q = malloc(sizeof(*q));
但我实际上建议避免完全隐藏变量是指针的事实。
- 您确实有内存泄漏,但这不是分段错误的原因,您应该在
main()
结束时调用 free(teste)
。
- 你的
main()
不 return 你应该在 free()
之后的 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。
好吧,我有这个可以工作的 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);
此外,我建议您解决这些其他问题
- 你不需要施法
malloc
- 你应该检查
malloc
没有 returnNULL
否则你将取消引用一个NULL
未定义行为的指针。 此外,您的
malloc
调用传递了错误的大小。一个可能的解决方法是使用Queue q = malloc(sizeof(*q));
但我实际上建议避免完全隐藏变量是指针的事实。
- 您确实有内存泄漏,但这不是分段错误的原因,您应该在
main()
结束时调用free(teste)
。 - 你的
main()
不 return 你应该在free()
之后的
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。