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

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

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

38 ответов

19 просмотров

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

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

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

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

Вообще, если вы только изучаете Си, то можете спокойно забыть про динамическое выделение памяти, тем более что 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, если аллоцировать не удалось.

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта