Я пишу программу сортировки слиянием. Но дело дошло до ошибки сегментации (дамп ядра) при запуске. вот код:
#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
?