调用qsort()对字符串数组排序后无法遍历输出问题求助
错误原因
你遇到的问题核心是混淆了二维字符数组和字符指针数组的内存布局与使用方式,导致qsort调用参数和比较函数完全不匹配,触发内存访问错误导致程序崩溃:
- 你注释的
char *ArchiveKomponents[]是字符指针数组,每个元素是指向字符串的指针,网上的示例比较函数就是为这种数组设计的。而你实际用的char ArchiveKomponents[100][20]是连续存储的二维字符数组,每个元素是长度为20的字符数组,没有指针层,原有比较函数完全不适用。 - 数组长度计算错误:
sizeof (ArchiveKomponents) / sizeof (char *)得到的不是二维数组的元素个数,正确的总容量计算应该是sizeof(ArchiveKomponents) / sizeof(ArchiveKomponents[0])。而且你当前只存入了2个有效元素,不应该按数组总容量传入qsort,应该自行维护变量记录实际存入的元素数量。 qsort的单元素大小参数传错:你传入了sizeof(char *)(通常是4或8字节),但二维数组每个元素占20字节,应该传入单个元素的大小sizeof(ArchiveKomponents[0])。- 比较函数逻辑错误:原有逻辑是把参数转成二级指针再解引用拿到字符串地址,对于二维字符数组来说,
qsort传给比较函数的指针直接指向字符数组首地址,不需要二级指针转换。
修正方案
- 新增变量记录实际存入的有效元素个数,避免
qsort排序未赋值的空元素 - 修改比较函数逻辑,直接转换为字符指针传入
strcmp - 修正
qsort的元素个数、单元素大小参数
完整可运行代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int cstring_cmp (const void *a, const void *b) { // 二维字符数组的元素直接是char数组,参数a/b直接指向数组首地址 const char *str1 = (const char *)a; const char *str2 = (const char *)b; return strcmp(str1, str2); } int main () { char ArchiveKomponents[100][20]; // 记录实际存入的有效元素个数 int valid_count = 0; strcpy(ArchiveKomponents[valid_count++], "R1890L"); strcpy(ArchiveKomponents[valid_count++], "F1284Z"); printf ("有效元素个数: %d\n", valid_count); printf ("Before [0]: %s\n", ArchiveKomponents[0]); printf ("Before [1]: %s\n", ArchiveKomponents[1]); // 传入有效元素个数、单个元素的实际大小 qsort(ArchiveKomponents, valid_count, sizeof(ArchiveKomponents[0]), cstring_cmp); printf ("After [0]: %s\n", ArchiveKomponents[0]); printf ("After [1]: %s\n", ArchiveKomponents[1]); return 0; }
内容的提问来源于stack exchange,提问作者mbk
相关产品推荐
相关产品推荐

