Первый Segfault
Одно место, где это наверняка вызовет segfault:
int size;
scanf("%d", &size);
int* a = (int *)malloc(size*sizeof(int));
, если вы передадите ему символ вместо числа, которое вписывается в целое число, это не получитсяпотому что scanf не собирается записывать в размер.
Вы должны проверить возвращение scanf
, которое является количеством успешно введенных элементов ввода:
if (scanf("%d", &size) != 1) {
fprintf(stderr, "Supplied size is not a valid number.\n");
return 1;
}
Утечка памяти
если realloc
возвращает NULL, потому что ему не удалось выделить достаточно места, вы получаете утечку памяти, потому что вы делаете:
int *a = realloc(a, ...);
Этот шаблон содержит ошибки, потому что назначение возврата realloc
длямассив, который вы хотите перераспределить, означает, что вы потеряете ссылку на выделенный массив, начиная с a == NULL
.Выполните:
int *temp = realloc(a, ...);
if (temp == NULL) {
free(a); // Or continue using it ..
} else {
a = temp;
}
Повреждение кучи
Ваша функция makeDouble
вызывает повреждение кучи из-за того, что вы получаете доступ и изменяете нехватку памяти.Я получаю realloc() abort: invalid next size
с glibc
, так что вы, скорее всего, разбиваете кучу, уже выделенную средой выполнения, но не достигаете следующей страницы, следовательно, нет Segfault и ошибки времени выполнения вместо этого.