使用 qsort 对二维数组进行排序 - 段错误

sort a 2d array using qsort - seg fault

我正在尝试对二维字符串数组进行排序,简化版本看起来像, (我不想将 "nameArray" 的数据类型更改为 "char *nameArray[4]" )

#include <sys/types.h>
#include <stdio.h>

int cstring_cmp(const void *a, const void *b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcasecmp(*ia, *ib);
}

int Test()
{
   char nameArray[4][10]={"test","alpha","Hyper","city"};
 //  int nElem = sizeof(nameArray)/sizeof(char *);
   int index = 0;

   //printf("nElem =%d\n", nElem);

   for(index=0; index < 4; index++)
   {
      printf("-> %s\n", nameArray[index]);
   }

   qsort( &nameArray[0], 4, sizeof(nameArray[0]), cstring_cmp);

   printf("After sort\n");

   for(index=0; index < 4; index++)
   {
      printf("-> %s\n", nameArray[index]);
   }
   return 0 ;
}

( 更新:已更改,以便我直接使用值 (4) 而不是计算 nElem。我的问题是让 qsort 正常工作。 )

比较函数的参数只是指针,而不是指向指针的指针。

我相信你也不需要强制转换,因为参数是 void *,你可以将它们分配给局部变量,编译器会处理它们。

试试这个:

int cstring_cmp(const void *a, const void *b)
{
   const char *ia = a;
   const char *ib = b;
   return strcasecmp(ia, ib);
}

如果您不需要局部变量,甚至可以删除它们(仅当您计划向比较函数添加更多代码时才需要它们):

int cstring_cmp(const void *a, const void *b)
{
  return strcasecmp(a, b);
}
int cstring_cmp(const void *a, const void *b)
{
  return strcmp(a, b);
}