我有以下比较功能:
int compareByMemSize(const void *a, const void *b)
{
const struct ProcInfo *procInfo1 = (const struct ProcInfo *) a;
const struct ProcInfo *procInfo2 = (const struct ProcInfo *) b;
if (( procInfo1->memSize != NULL && procInfo1->memSize[0] != '\0' ) && ( procInfo2->memSize != NULL && procInfo2->memSize[0] != '\0' ))
{
long memSize1 = strtol(procInfo1->memSize, NULL, 10);
long memSize2 = strtol(procInfo2->memSize, NULL, 10);
if (memSize1 < memSize2)
return -1;
if (memSize1 > memSize2)
return 1;
return 0;
}
if (procInfo1->memSize == NULL && procInfo2->memSize == NULL)
return 0;
if (procInfo1->memSize == NULL)
return -1;
return 1;
}
对以下结构进行比较逻辑:
typedef struct ProcInfo {
int PID;
char *name;
char *memSize;
} ProcInfo;
我像这样进行 qsort 调用:
qsort(&a, sizeof(a), sizeof(ProcInfo), compareByMemSize);
其中 a 是 ProcArray 类型:
typedef struct ProcArray {
ProcInfo *array;
size_t used;
size_t size;
} ProcArray;
结果是一个seg错误,我认为这是因为memSize可能是一个长字符arr,例如:122313131(它是一个char[],因为它最初包含一个“kB”,我取出了“kB” ' 用于比较)或 ' '。
一些 memSize 值最初也不存在,因此我通过将它们的 char[] 设置为“”进行补偿,因此检查上面的该字符。
我只是使用了 qsort 错误吗?或者如果没有找到错误的值,我将 char[] 设置为“ ”的方法是什么?
如果需要更多代码,我将非常乐意提供!
a
不是 ProcInfo
的数组,它是单个 ProcArray
结构。需要排序的数组是a.array
。
qsort(a.array, a.used, sizeof(ProcInfo), compareByMemSize);
传递
&
时不需要 a.array
,因为它已经是一个指针了。