На этой практике продолжаем разбираться с указателями. Но в отличие от предыдущей практики, где мы использовали автоматическую память, мы рассмотрим использование динамического выделения памяти на куче. После этой практики вы должны уметь без Google объяснить:

Примеры

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int* arr; // жил да был указатель
	arr = malloc(sizeof(int)); // и выделили для одного int место в памяти
	*arr = 42; // и положили туда 42
	printf("%p %d\\n", arr, *arr); // и напечатали адрес его на экране, как и само содержимое памяти
	free(arr); // и очистили память
	// и тут решили создать массив!
	size_t n = 10*10;
	arr = calloc(sizeof(int), n); // выделили память на массив размера n элементов, каждый по sizeof(int) байт.
	for (int i = 0; i < n;i++) {
		arr[i] = i*10; // заполнили его числами 0, 10, 20...,990
	}

	for (int i = 0; i < n; i++) {
		printf("%d %d\\n", *(arr+i), arr[i]); // а это одно и то же
	}
	free(arr);
}

Задания

  1. Во всех заданиях действует запрет на использование библиотечных функций, кроме malloc, calloc, realloc, free, printf, scanf.
  2. Вся логика задания должна находиться в функциях.
  3. В функции main ТОЛЬКО тестирование работоспособности функции.
  4. Прототипы функций менять запрещено.
  5. Вспомогательные функции создавать можно.
  6. Обязательно должна быть очистка памяти функцией free.

Примеры

Пример: Создание и удаление матрицы

Пример: Задом наперёд (в теорию)