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