Как корректно очистить память, которая была выделена с помощью 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. Это лучше, чем программа, продолжающая работать со случайными данными, как с осмысленными.