c Ошибка сегментации в macOS;иногда, а иногда нет - PullRequest
0 голосов
/ 06 октября 2018
  void makeDouble(int **a, int *size){
    int i, j;
    *size *= 2;
    *a = (int *)realloc(*a, (*size)*sizeof(int));
    for(i=0; i<*size/2; i++){
        (*a)[*size/2+i] = (*a)[i] * 2;
    }

    int temp;
    for(i=0; i<*size-1; i++){
        for(j=0; j<*size-i-1; j++){
            if((*a)[j]>(*a)[j+1]){
                temp = (*a)[j];
                (*a)[j] = (*a)[j+1];
                (*a)[j+1] = temp;
            }
        }
    }
}

$ это мой код.То, что я хотел сделать, это получить размер и ввод как размер, затем сделать их все удвоенными и отсортировать их.

Но когда я компилирую это, иногда оно падает из-за ошибки сегментации, а иногда нет.И иногда он говорит: "malloc: * ошибка для объекта 0x7fda70c02730: неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения. * установить точку останова в malloc_error_break для отладки прерывания прерывания: 6" Почему и чтоя могу сделать с этим?Извините, если мой вопрос плохой, я начинающий с c.

1 Ответ

0 голосов
/ 06 октября 2018

Первый 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 и ошибки времени выполнения вместо этого.

...