Как корректно очистить память, которая была выделена с помощью 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, что в общем случае лучше, чем программа, продолжающая работать со случайными данными, как с осмысленными. */
Объяснение кода листинга программы
- Объявлены две переменные: int * arrayPointer; size_t arraySize;
- Как-то получаем необходимый размер массива.
- Выделяем память с помощью функции malloc: arrayPointer = malloc(sizeof(arrayPointer) arraySize);
- Проверяем, была ли память выделена успешно. Если нет, то есть если arrayPointer равно NULL, то есть ошибка выделения памяти и нужно прервать программу.
- Как-то используем выделенную память...
- Освобождаем память с помощью функции free: free(arrayPointer);
- С этого момента значение переменной arrayPointer считается недействительным.
- Устанавливаем значение arrayPointer в NULL для того, что при попытке использовать память по адресу в указателе arrayPointer без повторной его инициализации получим NullPointerException. Это лучше, чем программа, продолжающая работать со случайными данными, как с осмысленными.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д