Я пытаюсь реализовать очереди в С. Coming из Java и других управляемых языков, я действительно борюсь с управлением памятью. Вот enqueue()
функция:таНоса терпит неудачу Катастрофический
int enqueue(Queue q, int value) {
Node newNode = malloc(sizeof(Node));
/*newNode->value = value;
if (q->size == 0)
q->head = newNode;
else
q->head->next = &newNode;
q->size++;*/
}
Я получаю эту ошибку:
malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
FWIW, вот остальная часть кода (это даже не так ли?):
typedef struct NodeStruct *Node;
struct NodeStruct {
Node* prev;
Node* next;
int value;
};
typedef struct QueueStruct *Queue;
struct QueueStruct {
Node* head;
Node* tail;
int size;
int capacity;
};
Queue newQueue(int size) {
Queue q = malloc(sizeof(Queue));
q->capacity = size;
q->size = 0;
q->head = NULL;
q->tail = NULL;
return q;
}
void printQueue(Queue q) {
printf("Queue of size %d, capacity %d", q->size, q->capacity);
}
int main() {
Queue myQ = newQueue(10);
// this seems to work
printQueue(myQ);
// epic fail
enqueue(myQ, 5);
return 0;
}
Почему это происходит?
Проблемы произошла, как до этого вызова 'malloc', когда вы затерт о прошлом что-то выделено более раннем вызовом' malloc' или с неинициализированным указателем. Удачи вам в этом. –
Несмотря на то, что код закомментирован, я укажу, что 'enqueue' действительно неверно: он сохраняет адрес переменной * local * (который даже не компилируется), и он не инициализирует членов 'Node'. Кроме того, добавление чего-то в очередь обычно связано с добавлением к хвосту, а не к элементу после головы. – jamesdlin
* Всегда * проверяйте результат 'malloc'! Для этого вы можете использовать обертку для этого (поиск по [xmalloc] (http://gcc.gnu.org/onlinedocs/libiberty/Functions.html#index-xmalloc-202) в Интернете). Если это домашнее задание, добавьте тег * homeework * к вопросу. –