Давайте попробуем решить этот вопрос с учетом различных аспектов
размер
malloc
позволяет вам выделять гораздо большие области памяти, чем те, которые выделяются просто с помощью student p;
или int x[n];
. Причина в том, что malloc
выделяет пространство в куче, а другой выделяет его в стеке
Язык программирования C управляет памятью статически, автоматически или динамически. Переменные статической длительности размещаются в основной памяти, обычно вместе с исполняемым кодом программы, и сохраняются в течение всего срока действия программы; Переменные автоматической длительности размещаются в стеке и приходят и уходят при вызове и возвращении функций. Для переменных статической длительности и автоматической длительности размер выделения должен быть постоянным времени компиляции (за исключением случая автоматических массивов переменной длины [5]). Если требуемый размер неизвестен до времени выполнения (например, если данные произвольного размера читаются пользователем или из файла на диске), то использование объектов данных фиксированного размера не подходит. ( из Википедии )
Область
Обычно объявленные переменные удаляются / освобождаются после блока, в котором они объявлены (они объявляются в стеке). С другой стороны, переменные с памятью, выделенной с помощью malloc
, остаются до тех пор, пока они не будут освобождены вручную.
Это также означает, что вы не можете создать переменную / массив / структуру в функции и вернуть ее адрес (так как память, на которую она указывает, может быть освобождена). Компилятор также пытается предупредить вас об этом, выдав предупреждение:
Предупреждение - адрес стековой памяти, связанной с локальной переменной 'совпадения', возвращается
Подробнее читать
Изменение размера (realloc
)
Как вы уже догадались, это невозможно обычным способом
Обнаружение ошибок
В случае, если память не может быть выделена: обычный способ может привести к завершению вашей программы, в то время как malloc
вернет NULL
, который можно легко перехватить и обработать в вашей программе
Внесение изменений в строковое содержимое в будущем
Если вы создаете в памяти строку типа char *some_memory = "Hello World";
, вы не можете сделать some_memory[0] = 'h';
, поскольку она хранится как строковая константа, а память, в которой она хранится, доступна только для чтения. Если вместо этого вы используете malloc, вы можете изменить содержимое позже.
Для получения дополнительной информации проверьте этот ответ
Для получения более подробной информации о массивах переменного размера посмотрите на это