не передать аргумент самописной функции - PullRequest
0 голосов
/ 21 июня 2020

Я пишу программу сортировки слиянием. Но дело дошло до ошибки сегментации (дамп ядра) при запуске. вот код:

#include<stdio.h>
#include<stdlib.h>
int* input_array(size_t *);
void divide_and_conquer_sort(int *restrict, size_t, size_t);
int main(void){
    size_t LEN=0;
    int *array;
    array=input_array(&LEN);
    puts("Here is a sort to all array's elements from small to large:");
    divide_and_conquer_sort(array, 0, LEN-1);
    for(size_t i=0; i<LEN; i++)printf("%d\040", array[i]);
    putchar('\n');
    return 0;}


int* input_array(size_t *ptr_to_LEN){
    int *array=(int*)malloc(sizeof(int));
    static char buf[BUFSIZ];
    void *alloc_check;
    fprintf(stdout, "Enter decimal integer arrays(use spaces key to separate every number):\n");
    while(fscanf(stdin, "%d", array+*ptr_to_LEN)==1)
    {
        alloc_check=realloc(array, (*ptr_to_LEN+2)*sizeof(int));
        if(alloc_check!=NULL)array=(int*)alloc_check;
        (*ptr_to_LEN)++; if(getchar()=='\n')break;
    }

    if(*ptr_to_LEN==0)
    {
        fprintf(stderr, "no number entered correctly.\n");
        exit(EXIT_FAILURE);
    }

    return array;}


void divide_and_conquer_sort(int *restrict array, size_t left, size_t right){
    size_t middle;
    middle=(left+right)/2;
    divide_and_conquer_sort(array, left, middle);
    divide_and_conquer_sort(array, middle+1, right);

    if(left==right)return;
    int *sub_array=(int*)malloc((right-left+1)*sizeof(int));
    size_t i, j, k;
    i=left; j=middle+1; k=0;
    while(i<=middle && j<=right)
    {
        if(*(array+i)<*(array+j))
        {
            *(sub_array+k)=*(array+i);
            i++;
        }
        else
        {
            *(sub_array+k)=*(array+j);
            j++;
        }
        k++;
    }
    while(i<=middle)
    {
        *(sub_array+k)=*(array+i);
        i++;
        k++;
    }
    while(j<=right)
    {
        *(sub_array+k)=*(array+j);
        j++;
        k++;
    }
    for(k=0; k<=right-left; k++)
        *(array+k+left)=*(sub_array+k);
    return;
}

input_array - функция ввода массива. Он получает адрес LEN и изменяет значение LEN по своему адресу. Фактически LEN - это длина входного массива. но когда я хочу передать LEN-1 в divide_and_conquer_sort, это не удалось!

Я использовал отладчик gdb, который сказал мне

0x00right=<error reading variable: Cannot access memory at address 0x7fffff7eefc8>)

, почему LEN-1 не может служить аргументом в divide_and_conquer_sort?

1 Ответ

1 голос
/ 21 июня 2020

Вы повторяете бесконечное количество раз и исчерпали доступное пространство стека. Вот почему отладчик не может прочитать адрес right, который находится в стеке.

Просто взглянув на код, вы можете понять, в чем проблема: каждый вызов divide_and_conquer_sort всегда приводит к еще двум вызовам divide_and_conquer_sort. Должно быть какое-то конечное условие, при котором вы возвращаетесь без вызова divide_and_conquer_sort, например, когда left и right совпадают. (Он там! Только не в том месте.)

...