Ошибка сегментации malloc c ++ - PullRequest
2 голосов
/ 29 апреля 2010

У меня проблема с malloc (). Это странно. Мой код в следующем. Я использую генератор случайных чисел для генерации элементов для массива. Массив открывается функцией malloc (). Если размер массива меньше 8192, это нормально. Если размер больше, чем 8192, он показывает ошибку сегмента.

void random_generator(int num, int * array) {

  srand((unsigned)time(0)); 
  int random_integer; 
  for(int index=0; index< num; index++){ 
    random_integer = (rand()%10000)+1; 
    *(array+index) = random_integer; 
    cout << index << endl;
  } 
}

int main() {
  int array_size = 10000;
  int *input_array;
  input_array = (int*) malloc((array_size));
  random_generator(8192, input_array);    // if the number is larger than 8192, segment fault
  free(input_array);
}

Ответы [ 7 ]

15 голосов
/ 29 апреля 2010

malloc() принимает размер в байтах, а не количество элементов. Размер int обычно составляет 4 байта, так что вы фактически выделяете только память для 2500 целых чисел. Вы выделяете array_size байтов, в то время как вы должны выделять array_size * sizeof(int) байтов.

Итак, ошибка будет исправлена ​​на

input_array = (int*) malloc(array_size * sizeof(int));

P.S. Никогда не предполагайте, что вам известен размер int или любого другого типа данных, так как он зависит от платформы. Всегда используйте sizeof().

P.P.S. Это действительно вопрос C, а не вопрос C ++. Если вы на самом деле используете C ++, вам следует рассмотреть возможность использования new и delete [] вместо malloc() и free() или, что еще лучше, использовать std::vector вместо массива, как указал Нил.

11 голосов
/ 29 апреля 2010

Вы хотите:

input_array = (int*) malloc( array_size * sizeof(int) );

Вы могли бы рассмотреть гораздо проще:

input_array = new int[ array_size ];
// stuff
delete [] input_array;

или даже:

std::vector <int> input_array( array_size );

и не нужно беспокоиться о бесплатном или удаленном вызове или об исключениях.

5 голосов
/ 29 апреля 2010

Учитывая, что это C ++, было бы гораздо лучше сделать следующее:

int main() 
{
  int array_size = 8192;
  int *input_array = new int[array_size];
  random_generator(array_size, input_array);
  delete[] input_array;
}

Редактировать: или еще лучше:

#include <vector>

int main() 
{
  int array_size = 8192;
  std::vector< int > array;
  array.resize( array_size );
  random_generator(array_size, &array.front());
}

И даже не беспокойтесь о сделке: D

4 голосов
/ 29 апреля 2010

input_array = (int*) malloc(sizeof(int) * (array_size));

Это потому, что параметром для malloc является число байтов, а int обычно имеет длину 4 байта.

3 голосов
/ 29 апреля 2010

Вы используете неверный вызов malloc. Вы должны использовать:

malloc(sizeof(int) * array_size)

Я думаю.

1 голос
/ 29 апреля 2010

Все остальные скрывали свою ошибку в динамическом размещении.
Но вы действительно хотите динамическое распределение?

int main() {
  int const array_size = 10000;
  int input_array[array_size];
  random_generator(8192, input_array); 
}
1 голос
/ 29 апреля 2010

Вы выделяете байты array_size, но вам нужны целые числа array_size. Попробуйте выделить массив_размер * sizeof (int) байтов в malloc.

...