Я думаю, что все malloc(sizeof(structure))
можно заменить следующим образом:
char[sizeof(structure)]
Тогда, когда требуется malloc
?
Я думаю, что все malloc(sizeof(structure))
можно заменить следующим образом:
char[sizeof(structure)]
Тогда, когда требуется malloc
?
Обратите внимание, что с динамическим распределением памяти не всегда невозможно (например, весь проект базового блока работает почти без него), но есть случаи, когда вам действительно нужно эмулировать его, используя большой статический буфер и записывая собственный распределитель.
Кстати, в С++ вы никогда не будете использовать malloc()
/free()
, но операторы new
и delete
.
Связанный: случай, в котором попытка работать без malloc
оказалась большой проблемой.
Вы будете использовать malloc для динамического выделения памяти, потому что:
Я вижу вашу точку зрения. Вы могли бы подумать, что вы всегда можете использовать декларативный синтаксис для всех этих, даже используя переменные, чтобы объявлять размер ваших пространств памяти, но это:
Вероятно, вы поймете это вовремя, не волнуйтесь.
Кроме того, вы должны попытаться узнать больше о модели памяти. Вы не используете одинаковые пространства памяти при использовании динамического выделения и при использовании статического выделения.
Для первых указателей посетите:
Дружественный совет: Я не знаю, разрабатываете ли вы C на * NIX или Windows, но в любом случае, если вы используете gcc, я рекомендую использовать следующие флаговые компиляции, когда вы учите себя:/p >
-Wall -ansi -pedantic -Wstrict-prototypes
Вы должны прочитать о распределении динамической памяти. Вы, очевидно, не знаете, что это такое.
Основное различие между ними состоит в том, что память, выделенная с помощью malloc()
, существует до тех пор, пока вы не скажете об этом. Статическая память, такая как char buff[10];
, существует только в области функций.
malloc - это динамический распределитель памяти, который помогает присваивать памяти переменным ur в соответствии с потребностью ur и, следовательно, уменьшает потерю памяти. Он также поддерживается функцией realloc(), благодаря которой u может редактировать требуемую память, которая u определены ранее через malloc() или calloc(). Короче говоря, мы можем сказать, что malloc() может использоваться для управления пространством памяти и использования необходимой памяти, не теряя ее.
Вы никогда не должны делать это так, как вы предлагаете. Другие уже рассказали вам о различии распределения хранилища в куче и распределении в стеке функций. Но если и когда вы выделяете в стеке, вы должны просто объявить свою переменную:
structure A = { /* initialize correctly */ };
Нет смысла или смысла делать это как (в принципе) нетипизированный массив char
. Если вам также нужен адрес этого зверя, воспользуйтесь адресом &A
.
Когда вы не знаете, сколько памяти выделяется во время компиляции. Возьмите очень простую программу, в которой вам нужно сохранить числа, введенные пользователем в связанном списке. Здесь вы не знаете, сколько номеров будет введено пользователем. Так как пользователь вводит номер, вы создадите node для него с помощью malloc
и сохраните его в связанном списке.
Если вы используете char[sizeof(structure)]
вместо malloc
, то я думаю, что никакого распределения динамической памяти не будет.
Помимо того факта, что ваш метод char[]
не может изменять размер или определять размер во время выполнения, ваш массив может быть неправильно выровнен для типа структуры, для которой вы хотите его использовать. Это может привести к поведению undefined.