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
相关产品推荐
相关产品推荐

