You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向BST插入新节点时原有节点单词值被覆盖问题咨询

问题原因

你遇到的覆盖问题和BST的插入逻辑无关,是字符串指针赋值的错误导致的:

  • 输入部分定义的char word[25]是栈上的固定内存块,每次执行scanf输入新单词时,新内容都会直接覆盖这块内存的原有数据
  • newWord函数中直接执行newWord->word = word,仅拷贝了指针地址,没有拷贝字符串本身的内容,所有插入的节点的word指针最终都指向同一块栈内存,自然会读取到最后一次输入的单词值。
修复方案

需要在创建新节点时独立拷贝字符串内容,修改newWord函数中word字段的赋值逻辑即可,需要先引入<string.h>头文件:

  1. 最简修改方式:使用strdup完成字符串拷贝
    将newWord中的newWord->word = word;替换为:
newWord->word = strdup(word);

strdup会自动申请刚好容纳目标字符串的堆内存,并完成内容拷贝,不需要手动计算长度。

  1. 兼容所有环境的手动实现方式:
    如果运行环境不支持strdup,可以手动申请内存+拷贝:
// 申请内存时要多留1位存储字符串结束符'\0'
newWord->word = (char*)malloc(strlen(word) + 1);
strcpy(newWord->word, word);
额外注意点
  • 后续实现节点销毁逻辑时,需要先free节点的word字段,再free节点本身,避免内存泄漏
  • 可以把输入的scanf修改为scanf(" %24s", word);,限制输入长度避免缓冲区溢出。

内容的提问来源于stack exchange,提问作者TMagnetB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:57:04