189 похожих чатов

Всем привет, учу Си, кто шарит, подскажите пожалуйста, зачем

вообще использовать ручное выделение памяти с помощью malloc() в си? Какой в этом смысл? Когда без этого нельзя обойтись? Вот к примеру (надеюсь я правильно понимаю) если мы обьявим массив, без указания размера int ar[ ]; А потом будем его где-то инициализировать, то компилятор сам выделит нужное количество динамической памяти и сам освободит его потом.

38 ответов

15 просмотров

Нет, в классическом Си компилятор не выделит сам память в рантайме.

Так нельзя объявлять, размер должен быть указан, либо взят по количеству элементов в инициализации

Компилятор не освободит)

Сергей- Автор вопроса

Вообще, если вы только изучаете Си, то можете спокойно забыть про динамическое выделение памяти, тем более что MISRA его не рекомендует.

Сергей
Ну или ОС

ОС освободит память только после завершения программы. Есть даже такая проблема - "утечка памяти". Это когда программа запрашивает все новые блоки, а старые не возвращает.

советую почитать про память, что такое стек, что такое куча. В Си, как и в голом С++, автоматически нечего с памятью не происходит, всё ручками, ручками

Electronics Designer
Так не сами же по себе.

Я мб неправ, но c++ также не даст использовать new, если malloc не определён.

Konstantin Zo
Я мб неправ, но c++ также не даст использовать new...

Ну механизм выделения памяти должен быть реализован, это да.

Сергей,качаешь вот эту книгу: https://m.vk.com/wall-54530371_4760 и начинаешь изучать Си, вопросы такого рода отпадут сами по себе))

Сергей
По ней и учу😃

😂😂 надо ещё лучше учить!

Сергей- Автор вопроса
Igor Zafievsky
Так нельзя объявлять, размер должен быть указан, л...

Да, попробовал точно нельзя так сделать. Что-то в голове смешалось. Но все же не понятно, чем будет отличаться к примеру int ar[18] и то же самое, сделанное с помощью malloc, ведь и там и там надо знать, какой размер памяти нужен.

Сергей
Да, попробовал точно нельзя так сделать. Что-то в ...

Временем жизни, областью видимости как минимум

Сергей- Автор вопроса
Konstantin Zo
Я мб неправ, но c++ также не даст использовать new...

В плюсах можно и перегрузить операторы new/delete под свой тип, для логов например))

Сергей
Да, попробовал точно нельзя так сделать. Что-то в ...

int arr[18] - может располагаться как минимум в 3-х местах в памяти в зависимости от контекста. а malloc всегда в куче ( если вы его не переопределяли)

Сергей
Да, попробовал точно нельзя так сделать. Что-то в ...

int ar[18]; память выделена на стеке функции, объем 18 * sizeof(int) байт . освобожжать не надо , при выходе из функции стековый фрейм будет разрушен. int* ptr_to_ar = (int *)malloc(18 * sizeof(int)); память выделена в куче процесса, объем, в данном случае - тоже 18 * sizeof(int) байт. надо вернуть в кучу этот блок памяти, когда больше не нужен. но вообще, да - надо тщательнее учить матчасть. что такое массивы, указатели, что у них общего. типы данных и указателей, области видимости переменных.

Сергей
Да, попробовал точно нельзя так сделать. Что-то в ...

А если у тебя в программе будет массив из структур например миллионного размера, как ты думаешь как это повлияет на память? struct Person[1000000];

Sergey
В плюсах можно и перегрузить операторы new/delete ...

Да я про то, что в смысле динамической памяти си от c++ не особо отличается. Нужен механизм выделения. Но про перегруз для логов я как-то не задумывался даже. Прикольно. Надо попробовать, спасибо)

Konstantin Zo
Да я про то, что в смысле динамической памяти си о...

))) Попробуй, вещь👍 Ну да, почти не отличается, кроме того что new в случае чего кидает исключение

Сергей- Автор вопроса
Peter Moroz
int ar[18]; память выделена на стеке функции, об...

А прямо в физической памяти можно жёстко выделить, по нужному адресу?

Х
А прямо в физической памяти можно жёстко выделить,...

нет. пользовательским процессам доступна только виртуальная память. в большинстве систем.

Х
Я скорее про барметал.

думаю, что можно. но как - не знаю. сходу не скажу.

Х
Я скорее про барметал.

Размечаешь свободную память под кучу) Выделяешь память размером с кучу.

Alexander
Размечаешь свободную память под кучу) Выделяешь п...

он хочет массив на стеке. но знать точно адрес , по которому он положит этот массив.

Peter Moroz
он хочет массив на стеке. но знать точно адрес , п...

Скорее в куче и чтоб компилятор туда больше ничего не клал

Х
Скорее в куче и чтоб компилятор туда больше ничего...

можно тогда . адрес начала кучи известен. как работает аллокатор, тоже известно.

Х
Я скорее про барметал.

Сделать в скрипте линкера секцию по интересующему адресу и положить переменную туда с помощью attribute ((section)).

Sergey
))) Попробуй, вещь👍 Ну да, почти не отличается, кр...

Есть new (std::nothrow) который не кидает, вернет nullptr, если аллоцировать не удалось.

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Карта сайта