Ошибка сегментации: 11 на Mac, но не на Linux при создании массива в C - PullRequest
0 голосов
/ 14 января 2019

Здравствуйте. Я недавно начал тестировать QuickSort. Я написал программу, которая создает массив с размером пользовательского ввода и заполняет его случайными числами, а затем использует быструю сортировку для его сортировки. Теперь вот моя проблема. На Linux-машине с 4 ГБ ОЗУ я мог создать массив размером до 10 ^ 8, прежде чем компьютер станет непригодным для использования. На моем Mac с 8 ГБ оперативной памяти я могу создать только массив размером до 10 ^ 6. Если я пытаюсь создать массив размером 10 ^ 7 и больше, я получаю ошибку сегментации. Это какое-то жесткое ограничение от операционной системы, его можно изменить? Вот мой код:

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

int FindPivot(int i, int j);
void PrintTable(int* table, int size);
void NextThing(int* table, int size);
void QuickSort(int* table, int i, int j);

void RandomizeTable (int* table, int size) { 

  int i;
  for (i = 0; i < size; i++) {
    table[i] = -10000 + rand() % (10000+1-(-10000));
    //printf("%d\t", table[i]);
  }
  printf("\n");
  NextThing(table, size);
}

void NextThing(int* table, int size) { 
  printf("Sorting the table...\n");
  clock_t x = clock();
  QuickSort(table, 0, size - 1);
  clock_t y= clock();
  printf("Time it took : %fs\n", ((double)(y - x))/CLOCKS_PER_SEC);

  //Second sorting of the table, just to see how long does it take for quicksort to sort an already sorted table
  printf("Sorting the table...\n");
  clock_t x2 = clock();
  QuickSort(table, 0, size - 1);
  clock_t y2= clock();
  printf("Time it took : %fs\n", ((double)(y2 - x2))/CLOCKS_PER_SEC);


  exit(0);
}

void Swap(int* table, int i, int j) {
  int temp;
  temp = table[i];
  table[i] = table[j];
  table[j] = temp;
}

int Partition(int* table, int i, int j) {
  int p, q, key; 

  p = FindPivot(i, j);
  key = table[p];

  Swap(table, i, p);

  for (p = i, q = i + 1; q <= j; q++)
    if (table[q] < key) {
      p++;
      Swap(table, p, q);
    }
    Swap(table, i, p);
  return p;
}

void QuickSort(int* table, int i, int j) {
  int p;
  if (i < j) {
    p = Partition(table, i, j);
    QuickSort(table, i, p - 1);
    QuickSort(table, p + 1, j);
  }
}//QuickSort 

void PrintTable(int* table, int size) {
    int i;
    for (i = 0; i < size; i++)
        printf("%d", table[i]);
    printf("\n");   
}

int FindPivot(int i, int j) {
  int pivot;
  /*pivot = i + rand() % (j + 1 - i); */ //Method I randomizing pivot
  pivot = (i + j) / 2; //Method II arithmetic avarage
  return pivot;
}



int main () {   

    time_t t;
    srand((unsigned) time(&t));

  int n;
  printf("Array size:");
  scanf("%d", &n);  
  int tab[n];     //Here is where error occurs if array size is > 10^6


  RandomizeTable(tab, n);

}

Я почти уверен, что проблема в создании массива такого размера. Я попытался отладить код с помощью printf. Он печатал текст, если он был до создания массива (в main ()), и не печатал бы его, если бы я поместил его позже.

1 Ответ

0 голосов
/ 14 января 2019

Предполагая, что вы используете C99, он может зависеть от реализации (но, вероятно, нет), где максимальный размер любого объекта ограничен SIZE_MAX, начиная с этой записи , что означает, что минимум (теоретически) может быть менее 10 ^ 6 (1 000 000) байтов.

Если это проблема, вы можете проверить что-то вроде

size_t max_size = (size_t)-1;

С здесь .

В противном случае лучше всего подойдет другой пост - если вы не можете реализовать его в стеке, используйте malloc , чтобы выделить его в кучу.

int *tab = malloc(n*sizeof(int));

Это выделит (n * sizeof (int в байтах)) байтов в куче и должно работать.

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

free(tab)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...