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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:27:31