改编K&R版快速排序后随机崩溃,求排查int数组排序问题
问题:通用版快速排序适配int数组时崩溃/输出随机数
改编《C程序设计语言》(K&R,ANSI版5.11节)的快速排序示例,原示例用于排序char *lineptr[1000]类型的指针数组,现尝试排序int *p或int p[4]类型的int数组,希望保留最通用的参数设计,但程序会随机崩溃,执行后总是出现随机数。尝试过绕过比较函数、修改基准值、调整numcmp函数的多种版本,但都无效。仅当使用非通用的mqsort(int* p, int start, int right)版本时程序可正常运行。
相关代码
#include <stdio.h> #include <stdlib.h> #define MAXNUMS 4 int numcmp(int* a, int* b); void mqsort(void* v[], int left, int right, int (*comp)(void*, void*)); void swap(void* v[], int i, int j); int numcmp(int* a, int* b) { return *a - *b; } void swap(void* v[], int i, int j) { printf("swap befor %d: %d, %d: %d\n", i, v[i], j, v[j]); void* temp; temp = v[i]; v[i] = v[j]; v[j] = temp; printf("swap after %d: %d, %d: %d\n", i, v[i], j, v[j]); } void mqsort(void* v[], int left, int right, int (*comp)(void*, void*)) { int i, last; if (left >= right) { return; } printf("left %d, right %d\n", left, right); for (int j = 0; j < 4; j++) { printf("%d, ", v[j]); } printf("\n"); swap(v, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) { if ((*comp)(v[i], v[left]) < 0) { ++last; swap(v, last, i); } } swap(v, left, last); for (int j = 0; j < 4; j++) { printf("%d, ", v[j]); } printf("\n"); mqsort(v, left, last - 1, comp); mqsort(v, last + 1, right, comp); } int main(void) { int i; /* doesn't work :( */ /* int* p; */ /* int* p_start; */ /* p_start = p = malloc(sizeof(int) * MAXNUMS); */ /* if (p == NULL) { */ /* printf("cannot allocate"); */ /* exit(1); */ /* } */ /* *(p + 0) = 1; */ /* *(p + 1) = 3; */ /* *(p + 2) = 5; */ /* *(p + 3) = 7; */ int p[MAXNUMS] = {1, 3, 5, 7}; for (i = 0; i < MAXNUMS; i++) { printf("%d, ", p[i]); } printf("\n"); mqsort((void**)p, 0, MAXNUMS - 1, (int (*)(void*, void*))numcmp); for (i = 0; i < MAXNUMS; i++) { printf("%d, ", p[i]); } printf("\n"); /* free(p); */ /* free(p_start); */ return 0; }
内容的提问来源于stack exchange,提问作者qkzk
相关产品推荐
相关产品推荐

