Ошибка сегментации при создании больших массивов в C

Вы, ребята, очень помогли мне с этим кодом. Позвольте мне в предисловии сказать, что я не очень хорошо знаю C и очень стараюсь это сделать.

Вот что должна делать программа:

1) Создайте список случайных чисел длиной 10 миллионов. 2) Сортируйте список случайных чисел, используя функцию сортировки оболочки (все еще не работает должным образом... Я думаю, это то, как я передаю указатель на функцию) 3) Составьте список 1 миллион дольше

4) повторить до 100 миллионов во время записи (время показывается как 0,0000000 по некоторым причинам)

Я просто пытаюсь протестировать эту программу сортировки оболочки и быструю сортировку, встроенную в стандартную библиотеку.

Я пробовал с и без указателей... закомментированный раздел должен работать, когда это сделано.. Это просто портит вещи больше LOL

Пожалуйста, помогите мне, ребята, вы были так здорово...

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


void shellSort(int *A, int n);
void checkSort(int *A, int n);

int main(){

    /*Initialize Random Array*/
    int unsorted_list[10000000];
    int *ptr = &unsorted_list[0];
    int random_number;
    int i;

    srand ( time(NULL) );
    for(i=0; i<10000000; i++){

        random_number = rand();
        unsorted_list[i] = random_number % 10000000;
    }

    //Do C Shell Sort
    double shell_results[10][2];

    double clock_diff;
    int j=10000000;
    clock_t t0, t1;
    int k;


    for(i=0;i<10;i++){



        /*Sort the list using shellSort and take the time difference*/
        t0 = clock();
        shellSort(ptr, j);
        t1= clock();

        /*Take difference in time*/
        clock_diff = (t1 - t0)/CLOCKS_PER_SEC;

        /*Add time and list length to the results array*/
        shell_results[i][0] = (double)j;
        shell_results[i][1] = clock_diff;


        /*Check to make sure the array has been sorted*/
        checkSort(ptr, j);

        /*Re-initialize a longer array*/
        //j+=1000000;
        //for(k=0; k<j; k++){
        //    random_number = rand();
        //    unsorted_list[k] = random_number % 1000000;
        //}

        printf("%d",(int)shell_results[i][0]);
        printf(" ");
        printf("%f",shell_results[i][1]);
        printf("\n");

    }





 return 0;
 }

 void shellSort(int *A, int n){



     int gap , i , j , temp;

     for (gap = n/2; gap>0; gap /=2)
         for (i=gap; i<n; i++)
             for(j = i-gap; j>=0 && A[j] > A[j+gap]; j-=gap){
                 temp = A[j];
                 A[j] = A[j + gap];
                 A[j + gap] = temp;
     }
 }



void checkSort(int *A, int n){

    int i;

    for(i=0;i<n;i++){

        if(A[i]>A[i+1]){

            printf("Error in sorting \n");
            break;
        }
    }


}

2 ответа

Решение

У вас, вероятно, нет 10 мегабайт стекового пространства. Сделайте этот массив глобальным, объявите его staticили выделить его динамически, используя malloc(), Если вы выберете последнее, не забудьте free() Это.

Позже, когда вам нужно будет использовать массив из 100 000 000 элементов, обязательно используйте для него новое выделение!

Что ж, у вас не будет такого количества места в стеке. Выделите его из кучи, используя malloc(). Не забудьте освободить () это потом.

Другие вопросы по тегам