我试图实现一个队列,它有可变大小的数组,但我有问题,它给我realloc: invalid next size;
的容量初始化为1,它只能达到容量=8然后如果我想插入更多的元素,它给了我错误
这是我的实现:
typedef int element;
typedef struct cell {
element *array;
int capacity;
int front, length;
} queue;
queue CreateQueue() {
queue q;
q.capacity = 1;
q.array=(element *)malloc(sizeof(element) * q.capacity);
q.front = 0;
q.length = 0;
return q;
}
int isFullQueue(queue q) {
return (q.length == q.capacity);
}
int isEmptyQueue(queue q) {
return ((q.length) == 0);
}
int Enqueue(queue *q, element e) {
if (isFullQueue(*q)) {
q->capacity = q->capacity * 2;
q->array = (int *)realloc(q->array, q->capacity);
if (!(q->array))
return 0;
for (int i = 0; i < q->front; i++) {
*(q->array + q->length + i) = *(q->array + i);
}
}
q->array[(q->front + q->length) % q->capacity] = e;
q->length = q->length + 1;
return 1;
}
至少这个问题:
尺寸计算错误@Eugene Sh .
// q->array=(int*)realloc(q->array,q->capacity);
// v----------------v Scale by referenced object
q->array= realloc(q->array, sizeof q->array[0] * q->capacity);
// ^----^ Cast not needed.
注意,不需要在*alloc()
代码行中编写类型。使用所指向对象的大小并避免类型可以提高初始编码、检查和维护的正确性。
更好的代码应该将新指针保存到临时指针中,然后再进行测试。在OP的代码中,在重新分配失败时,原始指针值将丢失。
void *t = realloc(q->array, sizeof q->array[0] * q->capacity);
if (t == NULL) {
return 0;
}
q->array = t;
Enqueue
函数存在2个问题:
-
重新分配大小不正确:你必须给出字节数,因此写:
q->array = realloc(q->array, sizeof(*q->array) * q->capacity);
-
你不应该直接覆盖
q->array
,因为编码你有一个内存泄漏的情况下realloc
失败。
其他函数也应该接受指向queue
的指针,而不是结构体副本。
修改后的版本:
#include <stdlib.h>
typedef int element;
typedef struct cell {
element *array;
int capacity;
int front, length;
} queue;
queue CreateQueue() {
queue q;
q.capacity = 1;
q.array = malloc(sizeof(*q.array) * q.capacity);
q.front = 0;
q.length = 0;
return q;
}
int isFullQueue(const queue *q) {
return q->length == q->capacity;
}
int isEmptyQueue(const queue *q) {
return q->length == 0;
}
int Enqueue(queue *q, element e) {
if (isFullQueue(q)) {
element *array = realloc(q->array, sizeof(*q->array) * q->capacity * 2);
if (array == NULL)
return 0;
q->array = array;
q->capacity = q->capacity * 2;
for (int i = 0; i < q->front; i++) {
q->array[q->length + i] = q->array[i];
}
}
q->array[(q->front + q->length) % q->capacity] = e;
q->length += 1;
return 1;
}