Вы должны выделить malloc
любую память, которой хотите управлять вручную, а не автоматически.Неважно, что там хранится: int
или double
или struct
или что-то еще;malloc
- это все о ручном управлении памятью.
Когда вы создаете переменную без malloc
, она сохраняется в стеке , а когда она выходит из области видимости, ее память автоматическиутилизирован.Переменная выпадает из области видимости, когда переменная больше не доступна;например, когда блок или функция, в которой переменная была объявлена в конце, заканчивается.
Когда вы выделяете память с помощью malloc
, она сохраняется в heap , а malloc
возвращает указатель наэта память.Эта память не будет восстановлена до тех пор, пока вы не вызовете free
для нее, независимо от того, останется ли указатель на нее доступным (если не осталось указателей на выделенную в куче память, это утечка памяти ).Это означает, что вы получаете возможность продолжать использовать память, выделенную вам после блока или функции, которая была выделена в конце, но, с другой стороны, теперь вы обязаны вручную освободить ее, когда закончите с ней.
В вашем примере foo2
находится в стеке и будет автоматически освобожден, когда main
закончится.Однако память, на которую указывает foo2.b
, будет не автоматически освобождаться, так как она находится в куче.Это не проблема в вашем примере, потому что вся память возвращается в ОС после завершения программы, но если бы она была в функции, отличной от main
, это было бы утечкой памяти.