【问题标题】:segfault in merge sort implementation合并排序实现中的段错误
【发布时间】:2013-11-04 12:11:00
【问题描述】:

我正在做一个 C 实现作为练习(我是学生)。我的逻辑很好(我之前使用过实现本身),但是在实际运行它时出现了段错误。我找了很久,不明白是什么原因造成的。这是我的完整代码:

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

#define ARRAY_CAPACITY 50

void do_sort(int* list); 
void merge_sort(int* list_of, int* buffer_of, int start, int end); 

void do_sort(int* list)
{
    int capacity = ((ARRAY_CAPACITY) / 2); 
    int buffer[capacity];
    merge_sort(list, buffer, 0, ARRAY_CAPACITY);   
}

void merge_sort(int* list_of, int* buffer_of, int start, int end)
{
    printf("%s", "hi!");
    int i, t; 
    if((end - start) < 2) return; 
    int mid = (start + end) / 2;

    merge_sort(list_of, buffer_of, start, mid); 
    merge_sort(list_of, buffer_of, mid, end);   

    int left = 0; 
    int right = mid; 

    for(i = 0; i < ARRAY_CAPACITY; i++)
    {
        buffer_of[i] = list_of[i]; 
    }

    for(t = start; t < end; t++)
    {
        if((left < (mid - start)) && (right == end || buffer_of[left] < list_of[right]))
        {
            list_of[t] = buffer_of[left];
            left++; 
        }

        else
        {
            list_of[t] = list_of[right]; 
            right++; 
        }
    }
}

int main()
{
    srand(time(NULL));
    int number_array[ARRAY_CAPACITY]; 
    int i; 
    for(i = 0; i < ARRAY_CAPACITY; i++)
    {
        number_array[i] = (rand() % 100); 
    }
    printf("%d\n", number_array[3]); 

    int j, m;  

    printf("%s\n", "Pre-Sorted Array: "); 
    for(j = 0; j < ARRAY_CAPACITY; j++)
    {
        printf("%d ", number_array[j]); 
    }

    do_sort(number_array); 
    for(m = 0; m < ARRAY_CAPACITY; m++)
    {
        printf("%d ", number_array[m]); 
    } 
    printf("\n"); 
}

输出如下:

50 (this is a random number, but it always prints successfully)
Pre-Sorted Array: 
Segmentation fault

所以当我尝试循环打印预排序的数组时会触发段错误,但我刚刚证明数组值设置正确,所以我无法理解这个错误。帮忙?

【问题讨论】:

  • 打印完预排序数组后换行;它使输出出现。当您在追踪崩溃时,请确保每个诊断打印都以换行符结尾,以便它出现。
  • 好的,这确实有效,但它仍然会在调用 do_sort 时立即出现段错误(在 merge_sort 中的小“嗨!” printf 甚至不会触发)。
  • 有趣...在 Mac OS X 10.9 上对我来说并没有崩溃。它也没有正确排序;它正在丢失各种数据并重复各种值。您是否编写了代码来检查数组是否已排序,并检查排序的守恒属性(原始数据项也必须出现在输出中;没有丢失的项目,没有额外的项目)?令人惊讶的是,您没有将要排序的项目数传递给顶级排序函数。调试 1-10 个项目比调试 50 个项目要容易得多。
  • 好的,我正在使用 GCC。奇怪的是它也没有排序。我会继续看下去的。
  • 查看Segmentation fault in Quicksort 以获取检查排序(守恒和排序属性)的可用示例。不完美,但可行。

标签: c arrays segmentation-fault


【解决方案1】:

你有以下代码:

void merge_sort(int* list_of, int* buffer_of, int start, int end)
{
    ...
    for(i = 0; i < ARRAY_CAPACITY; i++)
    {
        buffer_of[i] = list_of[i]; 
    }
    ...

该代码将在某一时刻被调用,并带有以下参数:

  • list_of 是一个由 50 个整数组成的数组。
  • buffer_of 是一个由 25 个整数组成的数组。
  • start 为 0。
  • end 是 50。

您会将list_of 的50 个元素复制到buffer_of,但buffer_of 只能容纳25 个元素。

【讨论】:

  • 就是这样。我也使用 memcpy 重新制作了副本以使其更清洁。谢谢你的收获。如果我认为那样理所当然,那就太愚蠢了。
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2015-09-10
  • 2016-03-07
  • 2022-10-15
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多