gpt4 book ai didi

c - 当 '->head' 指向另一个结构时,为什么我会留下 0x104567910 必须指向结构/union ?

转载 作者:行者123 更新时间:2023-11-30 19:52:29 31 4
gpt4 key购买 nike

试图找出当 head 指向结构时为什么会出现此错误。看起来 head 指向 QNODE 长度。为什么不是?

typedef struct Qnode QNODE;
struct Qnode
{
int length;
QNODE* next;
};
typedef struct lqueue lQUEUE;
struct lqueue
{
QNODE *head;
QNODE *tail;
};

lQUEUE lqueue_init_default(void)
{
lQUEUE* pQ = NULL;
pQ = (lQUEUE*)malloc(sizeof(lQUEUE));
pQ->head->length = NULL;
pQ->tail->length = NULL;
pQ->head->next = pQ->tail;
return *pQ;
}

最佳答案

对于这种类型的队列,lQUEUE lqueue_init_default(void) 返回一个结构

不幸的是,OP 的代码正在为结构分配内存,然后返回内存的副本。这会丢失指向分配的原始指针。

此外,pQ->head->length 取消引用 pQ->head,即使成员 head 尚未分配。当然,这就是“'->head'的左侧必须指向结构/union ”的原因,因为OP的运行时识别了pQ->head的无效性。

<小时/>

如何修复取决于未声明的编码目标。

很可能,为了匹配 lQUEUE lqueue_init_default() 明显的意图,分配 lQUEUE 结构的成员并返回它的副本。

 lQUEUE lqueue_init_default(void) {
lQUEUE lQ;
lQ.head = malloc(sizeof *(lQ.head)); // allocate memory for a QNODE, not lQUEUE
// If allocation successful ...
if (lQ.head) {
lQ.head->length = 0;
lQ.head->next = NULL;
}
lQ.tail = lQ.head; // start with head & tail pointing to the same `QNODE`.
return lQ;
}

另一种形式的lqueue_init_default()可以简单地将head, tail分配给NULL。这取决于未说明的其他编码目标。

 lQUEUE lqueue_init_default(void) {
lQUEUE lQ;
lQ.head = NULL;
lQ.tail = lQ.head; // start with head & tail pointing to the same `QNODE`.
return lQ;
}

使用示例

lQUEUE myQ = lqueue_init_default(void);
<小时/>

我发现这个队列仍然是浪费而且没那么有用。 队列不需要指向头和尾的指针即可在 O(1) 时间内添加到两端。

关于c - 当 '->head' 指向另一个结构时,为什么我会留下 0x104567910 必须指向结构/union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235774/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com