首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在node5之前,node2一直收到"Cannot access memory at address 0x0“的提示

在node5之前,node2一直收到"Cannot access memory at address 0x0“的提示
EN

Stack Overflow用户
提问于 2018-06-19 06:04:04
回答 2查看 291关注 0票数 -2

我查看了关于这个问题的其他帖子,原因似乎是没有正确分配内存/取消引用。输出仅显示存储在第一个节点中的数据,该节点是在Main函数中创建的。但是,我使用new分配每个新节点。下面是我的代码,如果有人可以看看的话:

代码语言:javascript
复制
struct people{
    Name name;
    double height;
    int weight;
};
struct Queue{
    people* ppl;
    int data;
    Queue* next;
};

void print(Queue * queueHead){
    Queue * traverse = queueHead;
    while(traverse!=NULL){
        cout << "height " << traverse->ppl->height << endl;
        traverse = traverse->next;
    }
}

void addNode(Queue*& queue, const people ppl){

    people* node = new people;
    node->name = ppl.name;
    node->height = ppl.height;
    node->weight = ppl.weight;

    Queue* traverse = queue;
    Queue* new_node = new Queue;
    while(traverse!= NULL){
        traverse= traverse->next;
    }
    new_node->ppl = node;
    new_node->next = NULL;
    traverse=new_node;
    traverse->next = NULL;
    }

int main(){
    Queue * queueHead = new Queue;

    people * node = new people;
    node->name = Ashley;
    node->height = 5.5;
    node->weight = 125;
    queueHead->ppl = node;
    queueHead->next = NULL;
    node=NULL;

people node2 = {
    .name = Peter,
    .height = 5.8,
    .weight = 145
};

people node3 = {
    .name = Bill,
    .height = 6.0,
    .weight = 160
};

people node4 = {
    .name = Mike,
    .height = 6.2,
    .weight = 150
};

people node5 = {
    .name = Chris,
    .height = 6.2,
    .weight = 140
};

addNode(queueHead,node2);
addNode(queueHead,node3);
addNode(queueHead,node4);
addNode(queueHead,node5);
//queueHead->next = NULL;

print(queueHead);
EN

回答 2

Stack Overflow用户

发布于 2018-06-19 06:47:45

addNode

代码语言:javascript
复制
Queue* traverse = queue;

queue地址的副本,这意味着它们指向相同的位置,但这并不是那么有帮助。作为示例,请注意循环迭代到列表末尾时发生的情况:

代码语言:javascript
复制
while(traverse->next != NULL){
    traverse= traverse->next;
}

遍历列表,但每次都会让traverse指向NULL,并且它与附加到列表的任何内容都是分开的。

代码语言:javascript
复制
traverse=new_node;

将新节点分配给traverse,但traverse是一个局部变量,它只指向与上一个节点的next相同的内容。遍历不在作用域之外,列表不会更新,并且新节点会泄漏。

代码语言:javascript
复制
Queue** traverse = &queue;

traverse始终指向一个next,而不仅仅是next的副本。如果更新*traverse,则可以修改该列表。例如,

代码语言:javascript
复制
void addNode(Queue*& queue, const people ppl){ 
 // I think you dropped a & here const pass by value isn't all that useful.

    people* node = new people;
    node->name = ppl.name;
    node->height = ppl.height;
    node->weight = ppl.weight;
    // the above should be done in a people copy constructor

    Queue** traverse = &queue;
    Queue* new_node = new Queue;
    while((*traverse)!= NULL){
        traverse= &(*traverse)->next; //traverse points at next instead of
                                      // being a copy.
    }
    new_node->ppl = node;
    new_node->next = NULL;
    *traverse=new_node; // pointing what traverse points at at the new node 
    (*traverse)->next = NULL; // this should really be done in a Queue constructor
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-19 06:30:50

您的add node函数实际上从未将新节点添加到现有队列中。

试试这个吧

代码语言:javascript
复制
void addNode(Queue*& queue, const people ppl){

    people* node = new people;
    node->name = ppl.name;
    node->height = ppl.height;
    node->weight = ppl.weight;

    Queue* traverse = queue;
    Queue* new_node = new Queue;

    while(traverse->next != NULL){
        traverse= traverse->next;
    }
    new_node->ppl = node;
    new_node->next = NULL;
    traverse->next = new_node;
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50918075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档