Learning_firstly 2023-09-23 10:57 采纳率: 100%
浏览 7
已结题

自定义函数复刻qsort时,运行后无法打印并且调试期间出现访问冲突

img

img


Swap:实现交换
cmp_char:实现char类型的比较
My_qsort:实现qsort
主函数:使用qsort并且打印使用My_qsort后的arr

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-23 12:14
    关注

    【以下回答由 GPT 生成】

    首先,我们来看为什么代码无法正确打印使用My_qsort排序后的数组arr。

    在你的自定义qsort函数My_qsort中,你使用了递归调用来对数组进行分区和排序。但是,你在调用My_qsort的地方有一个小错误。在这里:

    My_qsort(base, (upper - (char*)base) / size + 1, size, cmp);  // 这里应该是 (upper - lower) / size + 1
    

    应该是将 (upper - lower) 作为参数,而不是 (upper - (char*)base) 。这个错误导致了一个访问冲突。

    在你的My_qsort函数中,你还需要修改一些地方来解决访问冲突问题。在每次交换元素后,你也需要更新 pivot 的位置,以确保它指向正确的元素。在下面的代码中,我添加了对 pivot 的更新:

    if (lower <= upper) {
        Swap(lower, upper, size);
        lower += size;
        upper -= size;
        pivot = lower + ((upper - lower) / size) * size;
    }
    

    接下来,我们来解决无法正确打印排序结果的问题。在你的主函数中,你调用了标准库函数qsort来对数组进行排序并打印结果,但是在调用My_qsort函数后没有打印使用自定义排序函数排序的结果。

    你可以在调用My_qsort函数后,再次使用一个循环来打印数组的元素。这样你就能正确看到使用自定义排序函数排序后的结果了。

    下面是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 实现交换
    void Swap(void* a, void* b, size_t size) {
        char* temp = (char*)malloc(size);
        if (temp != NULL) {
            memcpy(temp, a, size);
            memcpy(a, b, size);
            memcpy(b, temp, size);
            free(temp);
        }
    }
    
    // 实现整型比较
    int cmp_int(const void* a, const void* b) {
        return (*(int*)a - *(int*)b);
    }
    
    // 实现自定义的qsort
    void My_qsort(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*)) {
        if (num <= 1) {
            return;
        }
        char* lower = (char*)base;
        char* upper = (char*)base + (num - 1) * size;
        char* pivot = lower + (num / 2) * size;
    
        while (lower <= upper) {
            while (cmp(lower, pivot) < 0) {
                lower += size;
            }
            while (cmp(upper, pivot) > 0) {
                upper -= size;
            }
            if (lower <= upper) {
                Swap(lower, upper, size);
                lower += size;
                upper -= size;
                pivot = lower + ((upper - lower) / size) * size;
            }
        }
    
        My_qsort(base, (upper - lower) / size + 1, size, cmp);
        My_qsort(lower, ((char*)base + num*size - lower) / size, size, cmp);
    }
    
    int main() {
        int arr[] = {5, 2, 8, 4, 1, 9};
        size_t num = sizeof(arr)/sizeof(arr[0]);
    
        qsort(arr, num, sizeof(int), cmp_int);
        for(int i=0; i<num; i++){
            printf("%d ", arr[i]);
        }
    
        printf("\nUsing My_qsort:\n");
        My_qsort(arr, num, sizeof(int), cmp_int);
        for(int i=0; i<num; i++){
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    

    这样修改后,你应该能够正确打印出使用My_qsort排序后的数组arr,并解决访问冲突问题。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月8日
  • 已采纳回答 9月30日
  • 创建了问题 9月23日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!