0

私は演習として C の実装に取り​​組んでいます (私は学生です)。ロジックは問題ありませんが (以前に実装自体を使用したことがあります)、実際に実行すると segfault が発生します。ずっと調べていたのですが、何が原因なのかわかりません。ここに私の完全なコードがあります:

#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

そのため、事前に並べ替えられた配列をループして印刷しようとすると、segfault がトリガーされますが、配列の値が適切に設定されていることを証明したばかりなので、このエラーを理解することはできません。ヘルプ?

4

1 に答える 1

2

次のコードがあります。

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_of50 個の整数の配列です。
  • buffer_of25 個の整数の配列です。
  • startは 0 です。
  • endは50です。

の 50 要素を にコピーしますがlist_ofbuffer_of25buffer_of要素分のスペースしかありません。

于 2013-11-04T04:11:00.527 に答える