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

BST程序疑问:为何每次循环malloc单词正常,单次malloc会出错?

二叉搜索树(BST)存储异常问题解析

问题现象

开发基于BST的软件时,两段代码表现出明显差异:

正常运行的代码

while (1)
{
    word = (char *)malloc(sizeof(char) * wordLength);

    readReturn = scanf("%s", word);
    if (readReturn == 0)
        return 0;
    BSTNode new = newBSTNode(word);
    if (strcmp(word, "END") == 0)
        break;
    TreeInsert(Tree, new);
}

输入"aaa" "bbb"时,树中存储的值正确,输出为"aaa" "bbb"。

运行异常的代码

word = (char *)malloc(sizeof(char) * wordLength);    
while (1)
{
    readReturn = scanf("%s", word);

    if (readReturn == 0)
        return 0;
    BSTNode new = newBSTNode(word);
    if (strcmp(word, "END") == 0)
        break;
    TreeInsert(Tree, new);
}

输入相同内容后,树中存储的值全部变为"bbb",输出为"bbb" "bbb"。

原因解释

核心问题在于内存地址复用与指针共享:

  • 第一段代码:每次循环都通过malloc分配全新的内存块,每个word指针指向独立的内存空间。输入"aaa"时,这块内存存入"aaa",BST节点保存该独立内存的地址;下一次循环分配新内存存入"bbb",节点保存新地址,两个节点的内存区域互不干扰,因此存储的值正确。
  • 第二段代码:仅在循环外分配一次内存,所有BST节点的word指针都指向同一块内存区域。第一次输入"aaa"时,内存内容为"aaa",节点保存该地址;第二次输入"bbb"时,scanf直接将"bbb"覆盖到同一块内存中,之前节点保存的地址指向的内容已被替换。最终所有节点的指针都指向这块被反复覆盖的内存,所以输出全是最后一次输入的"bbb"。

如果要在循环外分配内存,必须在创建节点时,将word的内容复制到新的独立内存块(比如用strdup函数,或手动调用malloc+strcpy),让每个节点持有内容的独立副本,而非共享同一个指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:45:53