C 如何对动态分配的2d字符数组进行qsort排序

C 如何对动态分配的2d字符数组进行qsort排序,c,arrays,2d,qsort,C,Arrays,2d,Qsort,我试图对动态分配的2d数组进行qsort排序,但没有成功。我假设这和动态分配有关,因为如果我使用全局2d数组(例如,fileList[148096][100]),情况会很好。有什么想法吗 // global: char **fileList; void allocateFileListArray(void) { int arraySize = 148096; int fileNameLength = 100; /* allocate storage for an array o

我试图对动态分配的2d数组进行qsort排序,但没有成功。我假设这和动态分配有关,因为如果我使用全局2d数组(例如,fileList[148096][100]),情况会很好。有什么想法吗

// global:
char **fileList;

void allocateFileListArray(void)
{
  int arraySize = 148096;
  int fileNameLength = 100;

  /*  allocate storage for an array of pointers */
  fileList = (char **) malloc(arraySize * sizeof(char *));

  /* for each pointer, allocate storage for an array of chars */
  for (int i = 0; i < arraySize; i++)
  {
      if ((fileList[i] = (char *) malloc(fileNameLength * sizeof(char))) == NULL)
          printf("failed fileList alloc\n");
    }
}

void sortTheArray(int fileListCount)
{
    qsort (( char * ) fileList, fileListCount, sizeof ( *fileList ), 
     (compfn) compareStrings );
}



 int compareStrings(char *stackA, char *stackB)
 {
    int result;

    result = strcmp( stackA->name, stackB->name);

    return(result);

}
//全局:
字符**文件列表;
void allocateFileListArray(void)
{
int arraySize=148096;
int fileNameLength=100;
/*为指针数组分配存储*/
fileList=(char**)malloc(arraySize*sizeof(char*);
/*对于每个指针,为字符数组分配存储空间*/
for(int i=0;iname,stackB->name);
返回(结果);
}
那么:

void sortTheArray(void)
{
    qsort (fileList, arraySize, sizeof(char *), (compfn) compareStrings );
}
?

查看qsort的定义并相应地传递参数


如果这不起作用,请查看compareStrings()。你是否有一个层次的间接太多或太少?因为没有关于compareStrings()的信息,所以无法确定它是否与此有关

您的char filelist[4095][100]示例与您在allocateFileListArray中的分配不同,指针数组与数组数组不同。 您应该更改qsort like的比较函数

int compareStrings(const void *stackA, const void *stackB)
{
  const char *a=*(const char**)stackA;
  const char *b=*(const char**)stackB;
  return strcmp(a,b);
}

您可以使用这个函数,而不必在qsort中使用难看的强制转换。

我在2D分配的int数组中也遇到了类似的问题。这是指向malloced空间的指针数组。有几个棘手的组成部分:

1) 在compare函数中的指针转换,如@user411313所述,它是指向指针的指针,因此必须取消引用两次才能获得值


2) 传递给qsort的大小。大小是指针的大小,而不是2D数组的列计数(如var[row][col])

您对二维数组排序的定义是什么?您可能希望对行进行排序。。。然后将适当的比较函数传递给它们…您不需要声明
fileListIndex
。只是一个猜测,但您使用的是
(sizeof(fileList)/sizeof(*fileList))
,这在固定大小的数组类型中是正确的,但在动态分配的数组中是不正确的。到底是什么问题?顺便说一句,你能为compareStrings()添加定义吗。另外:片段中不需要任何类型转换。删除它们。通过对2d数组进行排序,我的意思是按字母顺序对行进行排序。顺便说一句,如果没有malloc char**cast,Visual c编译器会给出一个错误,说明需要进行强制转换。错误如下:错误C2440:“=”:无法从“void*”转换为执行此操作的“char**”。另外,为什么compareStrings()的参数必须是“const”?请参阅qsort中回调比较函数的原型;永远不要忽略常量限定符