Как корректно очистить память, которая была выделена с помощью malloc? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день. Как корректно очистить память, которая была выделена с помощью malloc? Приведу код:
void print_array(int *a, int n)
{
    for(int i = 0; i < n; i++) {
        printf("%d", *(a+i));
    }
    printf("\n");
}
 
int main(int argc, char **argv) {
    printf("Привет\n");
    //наш массив
    int *a;
    //размер массива
    int n;
    //введём размер массива
    scanf("%d", &n);
    //выделим динамически память под массив
    a = (int*) malloc(n * sizeof(*a));
    
    for(int i = 0; i < n; i++) {
        *(a+i) = i;
    }
    
    print_array(a, n);  
 
    free(a);
 
    print_array(a, n);
    return 0;
}
Если начать работать с программой, то мы получим следующее:

Привет 4 0123 0023

Вопрос: почему после free(a) выводится 0023? Что случилось со значением "1", почему не изменились другие значения?

Решение задачи: «Как корректно очистить память, которая была выделена с помощью malloc?»

textual
Листинг программы
int * arrayPointer;
size_t arraySize;
/* как-то получаем необходимый размер массива */
arrayPointer = malloc(sizeof(*arrayPointer) * arraySize);
if ( arrayPointer == NULL ) {
    /* ошибка выделения памяти, скорее всего нужно прервать программу */
}
/* как-то используем выделенную память... */
free(arrayPointer); /* с этого момента значение переменной arrayPointer считается недействительным */
arrayPointer = NULL; /* а это исключительно для того, что при попытке использовать память по адресу в указателе arrayPointer без повторной его инициализации получите NullPointerException, что в общем случае лучше, чем программа, продолжающая работать со случайными данными, как с осмысленными. */

Объяснение кода листинга программы

  1. Объявлены две переменные: int * arrayPointer; size_t arraySize;
  2. Как-то получаем необходимый размер массива.
  3. Выделяем память с помощью функции malloc: arrayPointer = malloc(sizeof(arrayPointer) arraySize);
  4. Проверяем, была ли память выделена успешно. Если нет, то есть если arrayPointer равно NULL, то есть ошибка выделения памяти и нужно прервать программу.
  5. Как-то используем выделенную память...
  6. Освобождаем память с помощью функции free: free(arrayPointer);
  7. С этого момента значение переменной arrayPointer считается недействительным.
  8. Устанавливаем значение arrayPointer в NULL для того, что при попытке использовать память по адресу в указателе arrayPointer без повторной его инициализации получим NullPointerException. Это лучше, чем программа, продолжающая работать со случайными данными, как с осмысленными.

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы