【问题标题】:I am getting a Segmentation fault (core dumped) error with dynamically allocated arrays for merge sort in C?我在 C 中使用动态分配的数组进行合并排序时遇到分段错误(核心转储)错误?
【发布时间】:2014-09-30 18:56:56
【问题描述】:

我想我已经凝视了这么久,足以让我的眼睛翻到我的后脑勺。我正在尝试使用动态分配的数组实现升序合并排序,虽然(我相信)我的算法背后的逻辑是正确的,但我得到了分段错误(核心转储)错误。我知道这意味着在某个地方我有一个指针指向它不应该指向的地方,反之亦然,但我似乎无法弄清楚。有什么建议吗?

主要

int main(int argc, char *argv[])
{
  int my_array[ARRAY_SIZE];
  bool sorted = false;

  if( argc != 2)
    {
      printf("Program usage: %s sortname\n", argv[0]);
      return 1;
    }

  // Fill array with random numbers
  initArray(my_array, ARRAY_SIZE);

  // Sort array by chosen algorithm
  if(strcmp(argv[1], "bubble") == 0)
  {
    bubbleSort(my_array, ARRAY_SIZE);
  }
  else if(strcmp(argv[1], "merge") == 0)
    {  
      mergeSort(my_array, ARRAY_SIZE);
    }
  else
    {
      printf("Invalid sort algorithm. Must specifiy 'bubble' or 'merge'\n");
      return 1;
    }

  // Test if array is sorted correctly
  sorted = verifySort(my_array, ARRAY_SIZE);


  if(sorted)
    printf("Congrats! Array is sorted correctly\n");
  else
    printf("*** Error: Array sort algorithm fails verification test ***\n");

  return 0;
}

合并排序

//mergeSort is what I call from main, the array that is passed in is defined as: 
//int my_array[ARRAY_SIZE]; 
//It is filled with random numbers and passed into mergeSort
void mergeSort(int *array_start, int array_size)
{
    printf("Using merge sort algorithm...\n");

    int min = 0;
    int max = array_size-1;

    mergeSortHelper(array_start, min, max);
}

void mergeSortHelper(int *array_start, int min, int max)
{   
    int mid;

    if (min<max)
    {
        mid = (max+min)/2;
        //split into two halves
        mergeSortHelper(array_start, min, mid);     //left half
        mergeSortHelper(array_start, mid+1, max);   //right half
        merge(array_start, min, mid, max);
    }
}

void merge(int *array_start, int min, int mid, int max)
{
    int i, j, k, left, right;

    left = mid - min + 1;
    right = max - mid;

    int *leftArray = calloc(left, sizeof(int));
    int *rightArray = calloc(right, sizeof(int));

    //copy to left temp array
    for(i = 0; i < left; i++)
    {
        leftArray[i] = array_start[min+1];
    }

    //copy to right temp array
    for(j = 0; j < right; j++)
    {
        rightArray[j] = array_start[mid+1+j];
    }

    i = 0;
    j = 0;
    k = min;

    //merge temp arrays 
    while(i < left && j < right)
    {
        if(leftArray[i] <= rightArray[j])
        {
            array_start[k] = leftArray[i];
            i++;
        }
        else
        {
            array_start[k] = rightArray[j];
            j++;
        }
        k++;
    }

    //copy extra elements back to array
    while (i < left)
    {
        array_start[k] = leftArray[j];
        j++;
        k++;
    }

    while (j < right)
    {
        array_start[k] = rightArray[j];
        j++;
        k++;
    }

    free(leftArray);
    free(rightArray);
}

【问题讨论】:

  • 你用 valgrind 看看哪里出错了吗?
  • 如果您没有使用 malloc 或 calloc 为传入的数组分配空间,那么可能是最后对 free() 的调用导致了您的 seg 错误,因为这些数组是未在堆上分配,因此在技术上不是“运行时”
  • 您能否提供完整的代码(使用main() 函数)?这将帮助我们了解您的排序函数或传递给它的参数是否有任何问题。
  • @RockOnRockOut 我是 C 新手,我在 Ubuntu 中使用 gedit 和命令行(我也很陌生)并且不熟悉 valgrind。现在将前往谷歌!谢谢!
  • @Jay 我添加了 main

标签: c algorithm sorting segmentation-fault mergesort


【解决方案1】:
while (i < left)
{
    array_start[k] = leftArray[j];
    j++;
    k++;
}

对我来说,这看起来像是一个无限循环。它内部并没有改变ileft 的值,所以最终kj 增长到足以导致故障。

【讨论】:

  • 就是这样!谢谢!我不小心在那个函数中放了 j 而不是 i !只是需要另一双眼睛来捕捉错误。再次感谢!!
猜你喜欢
  • 2016-12-28
  • 2020-09-24
  • 2020-07-17
  • 2020-12-05
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2019-01-14
  • 2021-10-19
相关资源
最近更新 更多