字符串指针数组排序函数崩溃: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
相关产品推荐
相关产品推荐

