c/c++语言开发共享malloc灾难性地失败了

我正在尝试在C中实现Queue。来自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)); 

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

    在C中隐藏指针通常被认为是错误的样式。 这是因为你需要知道某些东西是指向正确使用它的指针。 (例如,即使使用标准库中的opaque类型FILE并将其作为FILE *传递)。

    这似乎让你误入歧途 – 例如,你的next和上next成员实际上是指针指针,这不是你想要的。 我建议:

     typedef struct NodeStruct Node; typedef struct QueueStruct Queue; struct NodeStruct { Node *prev; Node *next; int value; }; 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; } int enqueue(Queue *q, int value) { Node *newNode = malloc(sizeof(Node)); newNode->value = value; newNode->next = NULL; if (q->size == 0) { newNode->prev = NULL; q->tail = q->head = newNode; } else { newNode->prev = q->tail; q->tail->next = newNode; q->tail = newNode; } q->size++; return 0; } void printQueue(Queue *q) { printf("Queue of size %d, capacity %dn", q->size, q->capacity); } int main() { Queue *myQ = newQueue(10); printQueue(myQ); enqueue(myQ, 5); return 0; } 

    你已经破坏了你的堆

    如果你在linux上使用电栅栏或valgrind来找出你出错的地方

    编辑:你的意思

     Queue q = malloc(sizeof(QueueStruct)); 

    和节点相同

     Node n = malloc(sizeof(NodeStruct)); 

    我同意其他人 – 调用指向NodeStruct节点的指针非常误导。 最好将其称为NodePtr或PNode并调用结构节点。

      以上就是c/c++开发分享malloc灾难性地失败了相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522222.html

      (0)
      上一篇 2020年12月9日
      下一篇 2020年12月9日

      精彩推荐