C语言qosrt排序问题
在MDK中使用qsort排序时发现会卡死:
#include <stdio.h> #include <stdlib.h> int testdata[200] = {0,6,3}; int testcnt; int compare(const void *a, const void *b) { testcnt++; if (*(int *)a < *(int *)b) return -1; else if (*(int *)a > *(int *)b) return 1; else return 0; } void qsort_test(void) { qsort(testdata, 200, sizeof(int), compare); testcnt = testcnt; }
1、打开MicroLib使用qsort会导致排序卡死,但是增加栈空间后可以正常排序
2、 关闭MicroLib排序正常
3、打开MicroLib后,testcnt计数19902次,而关闭MicroLib后testcnt计数在1139次,可见打开MicroLib时调用的比较函数次数远大于未打开MicroLib时
可能的原因:MicroLib中的qsort函数可能使用了函数递归的方法,有栈溢出问题,所以当排序的数据量大时,会导致栈空间溢出
而标准C库中的qsort函数使用了伪递归的方法,仅在函数内部递归,不会有栈溢出问题