如何qsort动态分配2d char数组

时间:2011-11-20 10:26:31

标签: c arrays 2d qsort

我正在尝试qsort动态分配的2d数组,但没有成功。我假设它与动态分配有关,因为如果我使用全局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);

}

3 个答案:

答案 0 :(得分:1)

您的char文件列表[4095] [100]示例与您在allocateFileListArray中的分配不同,指针数组与数组的数组不同。 您应该更改qsort的比较功能,如

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中使用这个函数而不用丑陋。

答案 1 :(得分:0)

怎么样:

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

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

如果这不起作用,请查看compareStrings()。您是否有太多或太少的间接?因为没有关于compareStrings()的信息,所以不可能说,如果它与它有关。

答案 2 :(得分:0)

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

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

2)传递给qsort的大小。大小是指针的大小,而不是2D数组的列数(与var [row] [col]的情况一样)。