我正在尝试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);
}
答案 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]的情况一样)。