这个节点不像我想象的那样工作?

Posted

技术标签:

【中文标题】这个节点不像我想象的那样工作?【英文标题】:This Node doesn't work the way I thought? 【发布时间】:2021-09-10 10:18:06 【问题描述】:

这些是我定义的结构。


typedef struct stud
    int StudId;
    float GradePt;
STUDENT;

typedef struct StudentNode
    STUDENT* stud;
    struct StudentNode* link;
StudNode; 

下面是main函数中的代码。我只想创建一个链接在一起的 STUDENT 节点的单链表。但是我的代码抛出了奇怪的输出

StudNode* stud1;
StudNode* stud2;
stud1=(StudNode*)malloc(sizeof(StudNode));
stud1->stud->GradePt=3.54;
stud1->stud->StudId=4724;
stud1->link=(StudNode*)malloc(sizeof(StudNode));
stud2=(StudNode*)malloc(sizeof(StudNode));
stud2=stud1->link;
stud2->stud->GradePt=3.89;
stud2->stud->StudId=3424;
cout<<stud1->stud->StudId<<" has a grade of "<<stud1->stud->GradePt<<" out of 4"<<endl;
cout<<stud2->stud->StudId<<" has a grade of "<<stud2->stud->GradePt<<" out of 4"<<endl;
Output:
3424 has a grade of 3.89 out of 4
3424 has a grade of 3.89 out of 4

--------------------------------
Process exited after 1.216 seconds with return value 3221225477

【问题讨论】:

stud2=stud1-&gt;link; 感觉这是造成问题的原因 我删除了 C++ 标签,因为看起来 C++ 解决方案不是您想要的。可能不是正确的调用,因为转换 malloc 的结果是 C++ 的事情,但远不如 new 的 C++ 事情。 stud1-&gt;link=(StudNode*)malloc(sizeof(StudNode)); 看起来不太对劲。更少你要初始化节点,你可能想要一个像stud1-&gt;link=NULL 这样的哨兵。 建议:画出您希望这些节点如何链接的图片,然后完全按照说明跟踪您的代码,看看您是否可以绘制相同的图片。如果不能,您可能会立即看到并知道代码做错了什么。 “不像我想的那样工作”、“代码抛出奇怪的输出”、“主函数中的代码”都是无用的模糊。请学习并申请How to Ask,制作minimal reproducible example,描述所需的输出,解释与你得到的输出的对比。除此之外,衣架可视化可能会有所帮助 - 通常在涉及链接列表等时。 【参考方案1】:

StudNode 应该是:

typedef struct StudentNode
    STUDENT stud;                // No more a pointer
    struct StudentNode* link;
 StudNode; 

当然以后,stud 的访问权限必须更改。

以下几行有问题:

stud1->link=(StudNode*)malloc(sizeof(StudNode));    // Line 1
stud2=(StudNode*)malloc(sizeof(StudNode));          // Line 2
stud2=stud1->link;                                  // Line 3

在上面的代码中,您有一个内存泄漏:stdu2 在第 2 行获得分配的内存,并且在指针被替换为在第 1 行分配的 stdu1-&gt;link 之后立即。

第一行应该是stud1-&gt;link = NULL;

代码变成:

typedef struct stud
    int StudId;
    float GradePt;
STUDENT;

typedef struct StudentNode
    STUDENT stud;
    struct StudentNode* link;
 StudNode; 

StudNode* stud1;
StudNode* stud2;

// Initialize node 1
stud1=(StudNode*)malloc(sizeof(StudNode));
stud1->stud.GradePt=3.54;
stud1->stud.StudId=4724;
stud1->link=NULL;

// Initialize node 2
stud2=(StudNode*)malloc(sizeof(StudNode));
stud2->stud.GradePt=3.89;
stud2->stud.StudId=3424;
stud2->link=NULL;

// Link node 1 to node 2
stud1->link=stud2;

// Show data
cout<<stud1->stud.StudId<<" has a grade of "<<stud1->stud.GradePt<<" out of 4"<<endl;
cout<<stud2->stud.StudId<<" has a grade of "<<stud2->stud.GradePt<<" out of 4"<<endl;

【讨论】:

问题解决了。但我不明白为什么我不应该在 StudentNode 的声明中包含 STUDENT* stud?你能澄清一下吗? 可以在 StudentNode 中拥有STUDENT* stud;,但如果这样做,则必须在附加步骤中为其分配内存。拥有STUDENT stud; 是无用的,甚至会产生内存碎片和代码变慢的不利影响,因为在访问任何 STUDENT 成员时会再进行一次间接访问。

以上是关于这个节点不像我想象的那样工作?的主要内容,如果未能解决你的问题,请参考以下文章

Android布局权重不像我想的那样工作

Clickhouse:runningAccumulate() 不像我预期的那样工作

sleep() 不像我预期的那样工作

使用 Linq 除了不像我想的那样工作

变形金刚 BartTokenizer::add_tokens() 不像我对后缀的预期那样工作

UITableView -> numberOfRowsInSection 没有像我想象的那样工作......