这个节点不像我想象的那样工作?
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->link;
感觉这是造成问题的原因
我删除了 C++ 标签,因为看起来 C++ 解决方案不是您想要的。可能不是正确的调用,因为转换 malloc
的结果是 C++ 的事情,但远不如 new
的 C++ 事情。
stud1->link=(StudNode*)malloc(sizeof(StudNode));
看起来不太对劲。更少你要初始化节点,你可能想要一个像stud1->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->link
之后立即。
第一行应该是stud1->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 成员时会再进行一次间接访问。以上是关于这个节点不像我想象的那样工作?的主要内容,如果未能解决你的问题,请参考以下文章
Clickhouse:runningAccumulate() 不像我预期的那样工作