C语言动态存储谚语排序时出现值覆盖问题的排查求助(基于《Beginning C(第五版)》指针练习)
问题分析与修复方案
嘿,我一眼就揪出了你代码里的关键问题——就是你怀疑的排序交换部分,有个非常隐蔽的笔误!
核心错误
看这段交换代码:
tempP = proverbs[i]; proverbs[i] = proverbs[i+i]; // 这里错了! proverbs[i+1] = tempP;
你本来想把proverbs[i]和proverbs[i+1]交换,但写成了proverbs[i+i](也就是proverbs[2*i])。当第一次循环i=0时,这行就变成了proverbs[0] = proverbs[0],等于啥也没做,然后proverbs[1]被赋值为原来的proverbs[0],直接把你输入的"Bye"给覆盖了!这就是为什么输出里会重复"Hello World",而丢失了短的那句。
修复后的排序代码
把交换部分的错误行改成proverbs[i+1]就搞定了:
if (length_string1 > length_string2) { sorted = false; tempP = proverbs[i]; proverbs[i] = proverbs[i+1]; // 修正这里 proverbs[i+1] = tempP; }
额外优化:避免内存泄漏
另外,我注意到你最后只释放了proverbs这个二级指针,但每个proverbs[i]指向的是单独malloc出来的内存,这些内存也需要逐个释放,否则会造成内存泄漏。在free(proverbs)之前加上这段:
// 先释放每个谚语的内存 for (int i = 0; i < count; ++i) { free(proverbs[i]); proverbs[i] = NULL; }
测试验证
现在再用你给出的输入测试:
Hello World Bye This is the longest string
输出就会正确变成:
Your proverbs ordered by their length are: Bye Hello World This is the longest string
内容的提问来源于stack exchange,提问作者amehdi96
相关产品推荐
相关产品推荐

