我试图用C语言实现一个队列。来自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;
}

为什么会这样?

最佳答案

下面这句话可能会让你悲伤:

Node newNode = malloc(sizeof(Node));

Node是指针类型,因此只能分配足够的空间来容纳指针,而不是整个NodeStruct。我想你想做的是:
Node newNode = malloc(sizeof(*newNode));


Node newNode = malloc(sizeof(NodeStruct));

同样的问题存在于cc中,您只分配空间来保存指针,而不是Queue。我只注意到,在您的QueueStructNodeStruct中,您使用的是QueueStruct类型,实际上是Node*,这可能不是您想要的,因为NodeStruct **已经是一个指针。

08-15 23:45