【问题标题】:Shell sorting random float array not working [closed]外壳排序随机浮点数组不起作用[关闭]
【发布时间】:2014-01-28 20:13:31
【问题描述】:

我编写了一个 shell 排序算法,它在整数值上完美运行,但在尝试对浮点数进行排序时给了我分段错误。你能帮我解决这个问题吗?谢谢。

我们在大学有一个家庭作业,我的老师用插入排序编写了这个程序,它奏效了。我们的功课是将其重写为 shell 排序(我认为我做得正确),并可能进一步扩展它以对文件中的字符串和数字进行排序。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>

int int_cmp(const void *p1, const void *p2){
    return *(int*)p1 - *(int*)p2;
}

int float_cmp(const void *p1, const void *p2){
    if (*(float*)p1 == *(float*)p2){
        return 0;
    }
    else if (*(float*)p1 < *(float*)p2){
        return -1;
    }
    else {
        return 1;
    }
}    

void shell_sort(void *v, int nr, int size, int(*p_cmp)(const void*, const void*)){
    int i, j;
    void *pv, *pi, *pj;
    pv = malloc(size); //this is where I get segmentation fault

    for (int gap = nr/2; gap > 0; gap/=2){
        for (i = gap; i < nr; ++i){
            for (j = i-gap; j >= 0; j-=gap){
                pi = v; 
                pi = (char*)pi+j*size; 
                pj = (char*)pi+gap*size; 

                if (p_cmp(pi, pj) > 0){
                    memcpy(pv, pi, size);
                    memcpy(pi, pj, size);
                    memcpy(pj, pv, size);
                }
                else {
                    break;
                }
            }
        }
        free(pv);   
    }

}    

int main(){
    int a[20], n = 20;
    float b[25], m = 25;

    srand(time(NULL));

    printf("Original integer array: ");
    for (int i = 0; i < 20; ++i){
        a[i] = rand() % 100;
        printf("%i ", a[i]);
    }

    printf("Original float array: ");
    for (int j = 0; j < 25; ++j){
        b[j] = (float)rand()/(float)(RAND_MAX)*50;
        printf("%f ", b[j]);
    }

    shell_sort(a, n, sizeof(int), int_cmp);
    shell_sort(b, m, sizeof(float), float_cmp);

    printf("\nInteger array after sort: ");
    for (int i = 0; i < 20; ++i){
        printf("%i ", a[i]);
    }

    printf("\nFloat array after sort: ");
    for (int j = 0; j < 25; ++j){
        printf("%f ", b[j]);
    }

return 0;
}

【问题讨论】:

  • 这就是为什么你一次只改变一件事。
  • 了解如何使用调试器的好时机。
  • 并且要学会在使用调试器时不要过度倾斜。
  • 调试器告诉我分段错误。
  • 主声明也无效。请不要发布无法编译的代码,并期望有人帮助您。

标签: c shell sorting segmentation-fault


【解决方案1】:

free(pv); 移到 for 循环外(循环后)。

【讨论】:

  • 首先无法到达,因为pv的分配有问题。其次,你需要释放 pv,因为你在 pv 的帮助下在 pi 和 pj 之间进行切换。
  • 为什么free(pv)在循环内?
  • @MaXiMkA:你说的整数排序正在起作用,它会造成损害,践踏错误释放的内存。当浮点排序去分配内存时,它会遭受整数排序所造成的损害。反转排序顺序(在整数排序之前进行浮点排序);浮点排序(可能)会起作用,而整数排序(可能)会崩溃。
  • ,@MaXiMkA read freereference.(如果 free(ptr) 之前已经被调用过,就会发生未定义的行为。) 不能多次释放已分配一个区域。UB。
  • @BLUEPIXY:当您切换两个数字时,您需要第三个值,它是中性的。如果你不释放它(因为它是一个指针),它会搞砸的。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多