Ошибка сегментации простой функции - PullRequest
0 голосов
/ 17 июня 2019

Я получаю ошибку сегментации 11, когда вызываю эту функцию

    void flexibleArray(int *array, int *length) {
    int cnt = 0, number = 0;
    while (number!=-1) {
        printf("\nInsert the variable :"); scanf("%d", &number);
        if (number!=-1){
            cnt++;
            array = realloc(array, cnt * sizeof(int));
            array[cnt-1] = number;
        }
    }
    *length = cnt;
}

как

int *array = NULL, arrayLength;
flexibleArray(array, &arrayLength);

Это действительно простая функция, которую я всегда использовал, и я непоймите, почему это дает мне эту ошибку прямо сейчас.Я играл с ним, пытаясь поймать линию, которая создает мне проблему, и я обнаружил, что снятие линии *length = cnt;, очевидно, не доставляет мне проблемы.Могу ли я избежать ошибки, сохраняя эту строку?Спасибо

ПРАВИЛЬНЫЙ КОД:

   int* flexibleArray(int *length) {
    int *flexArray = NULL;
    int cnt = 0, number = 0;
    while (number!=-1) {
        printf("\nInsert the variable :"); scanf("%d", &number);
        if (number!=-1){
            cnt++;
            flexArray = realloc(flexArray, cnt * sizeof(int));
            flexArray[cnt-1] = number;
        }
    }
    *length = cnt;
    return flexArray;
}

и в main ()

int *array = NULL, arrayLength;
array = flexibleArray(&arrayLength);

1 Ответ

6 голосов
/ 17 июня 2019

как указатель, инициализированный нулем, а arrayLength просто определяется как int и не инициализируется

В этом случае вам нужно передать ссылку на функцию.

flexibleArray(&array, &arrayLength);

И функция станет

void flexibleArray(int **array, int *length) {
    int cnt = 0, number = 0;
    while (number!=-1) {
        printf("\nInsert the variable :"); scanf("%d", &number);
        if (number!=-1){
            cnt++;
            *array = realloc(*array, cnt * sizeof(int));
            (*array)[cnt-1] = number;
        }
    }
    *length = cnt;
}

Или

возвращает новый указатель из функции.

int *flexibleArray(int *array, int *length)
{
  ....
  return array;
}

из main

array = flexibleArray(array, &arrayLength);
...