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

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

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

Добрый день. Как корректно очистить память, которая была выделена с помощью malloc? Приведу код:
Листинг программы
  1. void print_array(int *a, int n)
  2. {
  3. for(int i = 0; i < n; i++) {
  4. printf("%d", *(a+i));
  5. }
  6. printf("\n");
  7. }
  8. int main(int argc, char **argv) {
  9. printf("Привет\n");
  10. //наш массив
  11. int *a;
  12. //размер массива
  13. int n;
  14. //введём размер массива
  15. scanf("%d", &n);
  16. //выделим динамически память под массив
  17. a = (int*) malloc(n * sizeof(*a));
  18. for(int i = 0; i < n; i++) {
  19. *(a+i) = i;
  20. }
  21. print_array(a, n);
  22. free(a);
  23. print_array(a, n);
  24. return 0;
  25. }
Если начать работать с программой, то мы получим следующее:

Привет 4 0123 0023

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

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

textual
Листинг программы
  1. int * arrayPointer;
  2. size_t arraySize;
  3. /* как-то получаем необходимый размер массива */
  4. arrayPointer = malloc(sizeof(*arrayPointer) * arraySize);
  5. if ( arrayPointer == NULL ) {
  6.     /* ошибка выделения памяти, скорее всего нужно прервать программу */
  7. }
  8. /* как-то используем выделенную память... */
  9. free(arrayPointer); /* с этого момента значение переменной arrayPointer считается недействительным */
  10. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы