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

字符串指针数组排序函数崩溃:strcmp调用处报错排查

问题分析与修复

核心崩溃原因:函数参数类型不匹配

你定义的sort_strings函数参数是char *list_ptr,但实际传入的是字符串指针数组(char *list_ptr[5])。在C语言中,指针数组传递给函数时会退化为char **(指向指针的指针),而非单个char *。

当你在函数里用list_ptr[j]时,编译器会把list_ptr当成char *类型处理,相当于把原本的指针值(比如list_ptr[0]的地址)当成字符串的起始地址去访问,这会导致非法内存访问,直接触发崩溃。

次要逻辑错误:最小值索引未正确初始化

smallest_string初始化为0,但外层循环的每一轮都应该将其重置为当前的i(即假设当前元素是最小值),否则后续循环会沿用之前的索引,导致排序逻辑错误。

修复后的代码

#include <stdio.h>
#include <string.h>

// 修改参数类型为 char** 或者 char* list_ptr[]
void sort_strings(char **list_ptr, int max_subscript);

int main()
{
    char list[][20] = { "Hallo", "Kaller", "Hirsch", "Annomy", "Musik" };
    char *list_ptr[5] = { 0 };

    for (int i = 0; i < 5; i++)
    {
        list_ptr[i] = list[i];
    }

    sort_strings(list_ptr, 5);

    // 打印验证排序结果
    for(int i=0; i<5; i++){
        printf("%s\n", list_ptr[i]);
    }

    return 0;
}

void sort_strings(char **list_ptr, int max_subscript)
{
    int smallest_string,
        i = 0,
        j = 0;

    char *temp = 0;

    for (i = 0; i < max_subscript; i++)
    {
        smallest_string = i; // 每轮循环重置最小值索引为当前i
        for (j = i + 1; j < max_subscript; j++)
        {
            if (strcmp(list_ptr[j], list_ptr[i]) < 0)
                smallest_string = j;
        }
        temp = list_ptr[i];
        list_ptr[i] = list_ptr[smallest_string];
        list_ptr[smallest_string] = temp;
    }
}

修复点说明

  • 将sort_strings的参数类型从char *list_ptr改为char **list_ptr(或char* list_ptr[],两者等价),确保类型匹配,正确访问指针数组元素。
  • 在外层循环内将smallest_string初始化为i,保证每轮排序都从当前位置开始寻找最小值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:56:20