Язык Си с нуля - Урок 24 - Динамическое распределение памяти, void*, утечки памяти.

  Рет қаралды 29,124

Begin End

Begin End

4 жыл бұрын

Это видео для тех, кто еще ни разу не программировал, но прошел предыдущие 23 урока.
В данном уроке мы изучим:
+ как динамически выделить память под указатель
+ как освободить память
+ что такое утечка памяти
+ что такое void*
► Плей лист - • Программирование на Си...
Уроки по теме:
► урок 21 - Указатели - • Язык Си с нуля - Урок ...
Язык Си с нуля - данный видеокурс предназначен для тех, кто еще ни разу не программировал. Здесь я максимально понятно пошагово обьясняю основы программирования на языке Си. Если хотите научиться программировать на языке Си - пройдите весь курс. Помимо объяснения материала я даю домашку. А после каждых нескольких уроков мы вместе пишем забавные игры!)

Пікірлер: 56
@k777ig
@k777ig 4 жыл бұрын
Огромное спасибо. Ну реально препод от бога. Люди не жлобите лайк, материал ведь годный)
@bishop_ru6767
@bishop_ru6767 4 жыл бұрын
Благодарю за урок + с уважением, Евген.
@user-mb9fj2py5g
@user-mb9fj2py5g 3 жыл бұрын
У тебя самые классные и максимально понятные уроки по Си
@Ilya1510
@Ilya1510 4 жыл бұрын
Хорошие уроки, автору канала респект
@user-lo2ue9zp7k
@user-lo2ue9zp7k 3 жыл бұрын
Спосибо автору так приятно и понятно смотреть ролик Ведь не каждый может или хочет доходчиво обяснить Есть много роликов где не то что учат а как буд то смотришь новости где быстро как из пулемета стреляют словами и пишут код , смотришь и говоришь себе зачем я трачу драгоценное время в пустую.
@jetbrain9115
@jetbrain9115 3 жыл бұрын
Отлично!
@user-sy2dy7or1q
@user-sy2dy7or1q 2 жыл бұрын
отличный контент
@Purpursarkans
@Purpursarkans 3 жыл бұрын
лучший
@yuliyacher67
@yuliyacher67 Жыл бұрын
Спасибо!
@bark205
@bark205 2 жыл бұрын
Тоха лучший!
@vanjabagdasaryan2160
@vanjabagdasaryan2160 2 жыл бұрын
МОЛОДЕЦ.
@ylikitishnik1946
@ylikitishnik1946 3 жыл бұрын
while(1) { printf("top!"); cout
@user-ic2wx3qw1w
@user-ic2wx3qw1w 4 жыл бұрын
Прошу заметить что функция free не возвращает бесплатную картошку фри!
@user-ic2wx3qw1w
@user-ic2wx3qw1w 4 жыл бұрын
Комментарий не имеет никакого смысла, кроме развлекательного, для помощи канала Антона!
@dicktv8810
@dicktv8810 5 ай бұрын
Может. Ведь в маллоке может храниться любая информация)
@okhramkov
@okhramkov 2 жыл бұрын
Вот только то сколько памяти занимает указатель не постоянная величина, а зависящая от размера компьютерного слова. На системах с разрядностью 32 это, и в правду, 4, а вот когда разрядность 64 размер указателя уже будет 8.
@ulysses.apokin
@ulysses.apokin 2 жыл бұрын
у меня х64, все равно 4
@ART-zp5bh
@ART-zp5bh Жыл бұрын
да, это вроде бы называется шиной адреса процессора
@erzhan225
@erzhan225 16 күн бұрын
@@ART-zp5bh длина машинного слова
@sergepisarsky2038
@sergepisarsky2038 Жыл бұрын
Одно замечание. Новичкам трудно иногда уследить за мыслью при таком темпе изложения.
@user-fv8uv2us9r
@user-fv8uv2us9r Жыл бұрын
Ага, особенно когда человек склонен терять концентрацию и задумывается о своём, как я) -это проблема ученика, а не учителя..?- А ещё лично я лучше понимаю на картинках и реальных примерах - беря в пример какие-то функции игр, например.. Кстати, для лучшего усвоения можно включить субтитры и/или замедлить скорость и вслушиваться, смотря в пустоту, представляя сказанное, т.к. изображение перед гладит может привлекать внимание и, ну, мешать Ну.. Или ещё как вариант - остановить воспроизведение, подумать о чём нужно, глубоко подышать (помедитировать, сконцентрироваться) и продолжить xD С другой стороны.. Если совсем уж никак настроиться - стоит лечь спать и отложить обучение на пробуждение.. 🤔
@marspriyom
@marspriyom Жыл бұрын
указатель может занимать 8 байт смотря какая архитектура
@temirkhanamanbaev42
@temirkhanamanbaev42 3 жыл бұрын
Антон что будет если я укажу меньше байт необходимого указателю, например 2 вместо 4?
@beginend95
@beginend95 3 жыл бұрын
Будет большая вероятность получить плавающую ошибку, которую очень трудно найти и исправить. Лучше так не делать)
@temirkhanamanbaev42
@temirkhanamanbaev42 3 жыл бұрын
@@beginend95 Все понял спасибо!
@user-nd4sl1lp9b
@user-nd4sl1lp9b 6 ай бұрын
Немогу понять зачем нужно в си работать с кучей(ведь столько много требований синтаксиса с динамической памятью),ведь уже написан си++(где это на много проще) ,который в автоматическом режиме контролирует,что бы не было утечки памяти по неосторожности программиста?
@cytorak875
@cytorak875 3 жыл бұрын
Антош, а почему ты не рассказал, что желательно в int main() вписывать в аргументы void, в плюсах понятно, что когда ты оставляешь мейн фукнцию без аргументов это значит, что для функции не разрешены параметры. В практике бывали ворнинги от компилятора, когда main оставался без void
@beginend95
@beginend95 3 жыл бұрын
Честно говоря, я про это забыл. Благодарю за замечание)
@cytorak875
@cytorak875 3 жыл бұрын
@@beginend95 рабочие моменты, будешь продолжать плейлист?) Всем, кто будет читать это, вот вам хороший совет: Всегда указывать аргумент void в int main (). Потому что такие компиляторы как clang, amd x86 open64 compiler suite, open watcom, digital mars (dm чаще пишут), часто ругаются за отсутствие void в качестве аргумента в ведущей функции! В плюсах можете об этом забыть, там все лучше
@beginend95
@beginend95 3 жыл бұрын
@@cytorak875 Да, в есть планах несколько тем. Но сначала ОпенГЛ, а потом С++.
@cytorak875
@cytorak875 3 жыл бұрын
@@beginend95 понял, спасибо большое) надо будет опенгл посмотреть, не разу не работал с ним
@cytorak875
@cytorak875 3 жыл бұрын
@@user-nt2zf4ex1b вообще да, но как я и написал выше это свойственно лишь некоторым компиляторам, в gcc, icc, clang этого нет не сегодняшний день. Если вы используете какой-то DM, то там это возможно, хотя в настоящий момент этого может и не быть
@dauletalmas7591
@dauletalmas7591 3 жыл бұрын
А почему в девятой строке не выдаёт никаких ошибок? Там должно быть приведение типов (int*) перед функцией malloc . У меня только так сработало.
@beginend95
@beginend95 3 жыл бұрын
В языке Си использование указателя void* не требует применения явного преобразования. Возможно ты что-то настраивал в среде.
@dauletalmas7591
@dauletalmas7591 3 жыл бұрын
@@beginend95 Понял. Я в проекте с++ писал, может из-за этого.
@user-uw1on7ll4z
@user-uw1on7ll4z Жыл бұрын
в 32 разрядной системе указатель занимает 4 байта, в 64 разрядной 8 завтра на 8 разрядном стм 8 запущу , интересно что будет, тк однобайтовый указатель бредово звучит, тк объем оперативки там килобайт)
@teflonatr9052
@teflonatr9052 10 ай бұрын
Привет! И что получилось в итоге? Интересно же :) Спасибо заранее.
@ashesha391
@ashesha391 2 жыл бұрын
Зачем в функцию malloc вставлять метод sizeof, ведь все указатели любого типа занимают 4 байта, почему нельзя просто указать 4?
@beginend95
@beginend95 2 жыл бұрын
потому что мы выделяем память не для адреса (указателя), а для ячейки памяти определенного типа, которая хранит значение (например int). Если будет char *c, то нужно будет выделить всего 1 байт. + Нам может понадобиться выделить память для структуры.
@smeh_noi
@smeh_noi Жыл бұрын
Компилятор упорно выдаёт ошибку и отказывается присваивать и выводить значение строке. Можете подсказать в чем проблема? char *z = NULL; z = malloc(sizeof(char)); if ( z != NULL){ *z = "tree"; printf("%s ", *z); }
@MC-hd5eb
@MC-hd5eb Жыл бұрын
Ты выделил память под 1 символ, а поместить туда пытаешься строку
@user-gt4eh8yz2c
@user-gt4eh8yz2c 3 жыл бұрын
Собственно, проблема в том, что последний printf не срабатывает. Если кто знает почему, напишите в ответы пожалуйста. Код: #include #include int main() { double *dPtr = NULL; int *iPtr = NULL; float *fPtr = NULL; dPtr = malloc(sizeof(double)); iPtr = malloc(sizeof(int)); fPtr = malloc(sizeof(float)); if((dPtr != NULL) && (iPtr != NULL) && (fPtr != NULL)){ *dPtr = 1.1; *iPtr = 1; *fPtr = 1.11; printf("*dPtr = %f; *iPtr = %i; *fPtr = %f; ",*dPtr, *iPtr, *fPtr); free(dPtr); free(iPtr); free(fPtr); dPtr = NULL; iPtr = NULL; fPtr = NULL; } if((dPtr = NULL) && (iPtr = NULL) && (fPtr = NULL)){ printf("Success."); } }
@user-pw7ef1mx7w
@user-pw7ef1mx7w 2 жыл бұрын
Я конечно поздно, но вдруг. Вместо 1 знака равно должно быть 2
@elliotalderson6609
@elliotalderson6609 3 жыл бұрын
sizeof это оператор, а не функция
@erzhan225
@erzhan225 16 күн бұрын
оператор и есть функция
@ostrov11
@ostrov11 4 жыл бұрын
Комментарий
@beginend95
@beginend95 4 жыл бұрын
благодарю за поддержку!)
@weekendshow7567
@weekendshow7567 Жыл бұрын
почему на экран выводится 333??? Ведь условие содержит, что на экран вывести 333, если х != NULL. Но ведь int *х = NULL на строке 9!!!
@mylordmilord
@mylordmilord Жыл бұрын
такой же вопрос
@teflonatr9052
@teflonatr9052 10 ай бұрын
Присоединяюсь к вопросу.
@temirkhanamanbaev42
@temirkhanamanbaev42 3 жыл бұрын
Почему у меня все равно показывает 8 байт вместо 4?
@beginend95
@beginend95 3 жыл бұрын
В 64 разрядных приложениях указатель занимает 8 байт. В 32 разрядных - 4 байта.
@temirkhanamanbaev42
@temirkhanamanbaev42 3 жыл бұрын
@@beginend95 Спасибо!
@nokia_n-gage
@nokia_n-gage Жыл бұрын
Комментарий
@yrikitishnik1680
@yrikitishnik1680 Жыл бұрын
Комментарий
@yrikitishnik1680
@yrikitishnik1680 Жыл бұрын
Комментарий
Выделение и освобождение динамической памяти в Си
27:39
Increíble final 😱
00:37
Juan De Dios Pantoja 2
Рет қаралды 111 МЛН
Khóa ly biệt
01:00
Đào Nguyễn Ánh - Hữu Hưng
Рет қаралды 21 МЛН
Техника безопасности при работе с памятью в Си
19:25
Тимофей Хирьянов
Рет қаралды 34 М.
Всё об указателях в C++ за 20 минут
20:00
Increíble final 😱
00:37
Juan De Dios Pantoja 2
Рет қаралды 111 МЛН