Выделение и освобождение динамической памяти в Си

  Рет қаралды 86,957

Тимофей Хирьянов

Тимофей Хирьянов

5 жыл бұрын

Распределение ресурсов операционной системой.
Выделение динамической памяти: malloc().
Функция sizeof(тип), вычисляемая при компиляции.
Необходимость освобождения памяти: free().
Независимость выделяемых отрезков памяти.
Чем отличается функция calloc().
Курс молодого бойца по информатике (Язык Си).
cs.mipt.ru/c_intro

Пікірлер: 116
@RevernBlitz
@RevernBlitz 4 жыл бұрын
Я так понял мне даже ОС не даст😢
@user-nr2mg1pg6v
@user-nr2mg1pg6v 2 жыл бұрын
Проси ПЧЁЛ...
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@vasily2dndn
@vasily2dndn 11 сағат бұрын
Спасибо за урок, легенда второго номера егэ по информатике😅
@bishop_ru6767
@bishop_ru6767 4 жыл бұрын
Благодарю за лекцию + с уважением, Евген.
@maxk-ff6575
@maxk-ff6575 5 жыл бұрын
спасибо за уроки, сначала хотел уточнить одну деталь, но вопрос снялся при просмотре других лекций.
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@user-in8cs4me8q
@user-in8cs4me8q Жыл бұрын
Под последним Вашим видео отключены комментарии, по этому пишут тут. Хотел выразить свою поддержку и сказать огромное спасибо за работу.
@popopopo8317
@popopopo8317 2 жыл бұрын
Отлично объясняете)
@gamingplay5415
@gamingplay5415 2 жыл бұрын
Интересная подача информации👍😃
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@v_chelnik
@v_chelnik Жыл бұрын
Все уроки топ! в свое время сильно помогли
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@user-tc8dd3nr1f
@user-tc8dd3nr1f 3 жыл бұрын
Только благодаря вам узнал про мебибайты и кибибайты.. Спасибо!
@melkorbsd
@melkorbsd Жыл бұрын
Кибибайты были введены относительно недавно, в 1998 году, до этого у программистах не возникало проблем использовать разные приставки "кило" и "мега" в программировании и физике:) А потом им вдруг сложно стало.
@artofbarto
@artofbarto 2 жыл бұрын
крутой препод, спасибо!
@video0607
@video0607 2 жыл бұрын
Спасибо Тимофей!
@recreationreally4382
@recreationreally4382 4 жыл бұрын
1. Можно накладные расходы показать: на выделение и высвобождение памяти, и попутно на пустые циклы. 2. Не хватает функций realloc и memset. 3. Можно сравнить время доступа при работе с памятью, выделенной большими блоками и маленькими.
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@user-ui5yh1qp4f
@user-ui5yh1qp4f 7 ай бұрын
отличный урок😍👍
@v_chelnik
@v_chelnik 2 жыл бұрын
Спасибо вам, Тимофей, из школы 21!
@user-dq6iw4sm4k
@user-dq6iw4sm4k Жыл бұрын
Попал на основу?
@Utars
@Utars Жыл бұрын
Какой город? Случайно не Новосибирск?
@v_chelnik
@v_chelnik Жыл бұрын
@@Utars Казань
@truebrostory5723
@truebrostory5723 3 жыл бұрын
Лучший!
@yuliyacher67
@yuliyacher67 Жыл бұрын
Спасибо!
@jhonlauder2736
@jhonlauder2736 Жыл бұрын
Тимофей, благодарю за искусно преподнесённый контент! Очень наглядно и с примерами. Эксперименты над железом... Прикольно, что при k
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@ImmortalBest
@ImmortalBest 5 жыл бұрын
16Гб ОЗУ ) я думал там ведро с 2Гб и Core2Duo ))нормальная тачка, можно в Unity или Unreal творить ништяки
@UCanDo
@UCanDo 4 жыл бұрын
Спасибо за лекцию! Подскажите, а в чем существенное отличие, если я объявлю глобальную переменную и изменю ее в функции и передачей адреса переменно для функции? В чем отличие?
@user-mm5ln4qh5q
@user-mm5ln4qh5q Жыл бұрын
В реальном мире ты никогда не сможешь заюзать "глобальную" переменную для этого.
@trigeminalneuralgia9889
@trigeminalneuralgia9889 Жыл бұрын
скорость, во-первых, во-вторых, функции типа void не могут что-либо менять без указателя, void change_number(int number) { number *= 2; } int main(void) { int x = 666; change_number(x); // ничего не делает return 0; }
@konstantinmyshov1388
@konstantinmyshov1388 3 жыл бұрын
Объявление массива в виде int N; scanf("%d", &N); char A[N]; это фича GCC. Стандарт этого делать не позволяет. Размер массива должен быть вычислен на этапе компиляции.
@AspireM3400
@AspireM3400 2 жыл бұрын
Не обязательно GCC. Если в компиляторе есть поддержка VLA, то пропустит, нет - матюкнется. А для GCC есть флаг, запрещающий использование подобных массивов (-Werror=vla).
@user-mm5ln4qh5q
@user-mm5ln4qh5q Жыл бұрын
VLA есть в стандарте, так что всё ок)
@juvusart
@juvusart 5 жыл бұрын
Когда мне особенно грустно, я запускаю ideшку, и прописываю аллокацию какого-то куска памяти...просто так. Сразу после этого чуствуешь, что с си ты творец, ты всемогущ, тебя никто не сможет победить....
@batfist6595
@batfist6595 4 жыл бұрын
Ты можешь повелевать оперативкой. Своими пальцами, ты прикинь. Ты управляешь информацией так, как тебе угодно. Ты бог оперативки
@nickjonas8257
@nickjonas8257 3 жыл бұрын
Питонисты хором скажут: НООООООУ
@tocvb232
@tocvb232 2 жыл бұрын
@@nickjonas8257 ну ты до строк в си дойдёшь, так же завопишь. Да и вообще питон не для этого делали... (мимо, начал программировать в си и чуть-чуть покодил в питоне)
@xeither289
@xeither289 Жыл бұрын
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@xeither289
@xeither289 Жыл бұрын
@@batfist6595 GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@kovesik
@kovesik 5 жыл бұрын
Ворнинга на 6:00 нет потому что Си неявно преобразует указатели.
@alexs7952
@alexs7952 2 жыл бұрын
OS didn't gave memory - неправильно. Правильно didn't give.
@kirillshvedov8417
@kirillshvedov8417 3 жыл бұрын
Ну чтоб подождать)) 3:17
@tacowilco7515
@tacowilco7515 4 жыл бұрын
10:21 "OS didn't give ..."
@user-ku8jc7lt9b
@user-ku8jc7lt9b 3 жыл бұрын
"... a flying f*ck". xD
@RG-sj1jb
@RG-sj1jb Жыл бұрын
Спасибо за лекцию! Вопрос: после освобождения памяти free(A) мы же не сможем обращаться к массиву? зачем тогда освобождать, если нельзя продолжить работу с массивом?
@semyonarteev3100
@semyonarteev3100 Жыл бұрын
чтобы он не занимал память процесса
@user-ii1td7iq5j
@user-ii1td7iq5j 3 жыл бұрын
😎😎😎😎
@user-yd1bj3hn8d
@user-yd1bj3hn8d 5 жыл бұрын
А что насчет realloc'a?
@MaxPV1981
@MaxPV1981 Жыл бұрын
Тимофей, вопрос по 26 минуте: - Всё же указатели можно сравнивать, как я понимаю - просто бессмысленно в свете предполагаемой цели, так как даст некорректные значения? Разве нельзя придумать задачу, по которой нужно сравнивать именно указатели из разных областей памяти - ну, исследует человек пространство памяти, что такого? :)
@AnonIm-if3cw
@AnonIm-if3cw 3 жыл бұрын
int *A = (char *)malloc(N*sizeof(int)) - я один заметил, что там (char *) лишний🤔
@polinakononova8453
@polinakononova8453 2 жыл бұрын
int* должно быть, если правильно понимаю
@jojomajo
@jojomajo 4 жыл бұрын
Она постоянно не даёт, что-то вечно растет и падает, система не выдерживает выдает ошибки, все прям как в жизни)
@user-nd4sl1lp9b
@user-nd4sl1lp9b 5 ай бұрын
А правда ли,что в си++ можно не парится за утечку памяти из кучи?Там всё происходит почти автоматически(библиотека stl).И нет необходимости следить за каждым шагом работы с динамической памятью?
@user-bv8wy8cn7o
@user-bv8wy8cn7o Жыл бұрын
А почему в начале видео не используется free( ) для освобождения памяти?
@learpcss9569
@learpcss9569 4 жыл бұрын
вопрос. Вы вводили в переменную N громадные значения. должно же быть переполнение по идее? и будет запрос на выделение памяти от отрицательного количества бит. какое вообще поведение будет у malloc? мне не совсем понятно.
@user-gr5ec2tf5s
@user-gr5ec2tf5s 3 жыл бұрын
Непонятно? так проверь ёпта
@learpcss9569
@learpcss9569 3 жыл бұрын
@@user-gr5ec2tf5s ок, результаты через час.
@linterrupt
@linterrupt 3 жыл бұрын
@@learpcss9569 понимаю, что не актуально. но int вмешает обычно 4 000 000 000. А он запихивал 2 000 000 000
@7qim
@7qim 2 жыл бұрын
@@linterrupt Это если он *_unsigned_*_ int,_ а просто _int_ это на самом деле *_signed_*_ int,_ то есть вмещать может не 0...4,2 млрд, а -2,1...2,1 млрд.
@user-cm1ri1sn2u
@user-cm1ri1sn2u 8 ай бұрын
Тимофей, с did используется глагол в форме инфинитива, didn't gAve - неправильно.
@nicholasspezza9449
@nicholasspezza9449 5 ай бұрын
в данном случае "неправильно" должно писаться слитно, грамотей 🐒
@user-cm1ri1sn2u
@user-cm1ri1sn2u 5 ай бұрын
@@nicholasspezza9449 благодарю за ликбез. Исправил
@roman6572
@roman6572 Жыл бұрын
Норм то, что там где выделяем память, при водим void* к char* и присваиваем переменной int*?
@misana77
@misana77 5 жыл бұрын
sizeof - это оператор, а не функция
@tkhirianov
@tkhirianov 5 жыл бұрын
Вы правы. Просто меня учили, что это "функция, вычисляемая в момент компиляции", а по первоисточникам я не могу всю терминологию проверять. К счастью, это не меняет сути дела. На будущее учту вашу поправку.
@Mani_Fast
@Mani_Fast 2 жыл бұрын
спасибо особо интересно было, я вот тут побаловался и увидел как график постепенно растет если добавить задержу и увеличивать размер массива. #include #include #include int main(void) { int N = 10; printf("Enter size of array to create: "); //scanf("%d", &N); while (1) { int *A = (int*)malloc(N*sizeof(int)); //int *A = (int*)calloc(N, sizeof(int)); 0 if (A == NULL) { printf("OS not gave mamory. Exit... "); exit(1); } for (int i = 0; i < N; i++) { A[i] = i; } printf("Array successefully created! "); N+=10; Sleep(1); //free(A); } printf("\tArrays successefully created! "); system("pause"); return 0; } а если убрать задержку то видно как он резко взлетает как квадратичная функция
@kirillshvedov8417
@kirillshvedov8417 3 жыл бұрын
15:36
@michaeljordan1283
@michaeljordan1283 Жыл бұрын
7:50 память возвращается системе - без функции free()?
@alexanderm6862
@alexanderm6862 4 жыл бұрын
Просящему даётся, с операционной системой как с женщиной
@the_byte.
@the_byte. 3 жыл бұрын
да, в чём-то они похожи..
@frivolouselm7529
@frivolouselm7529 3 жыл бұрын
на 17:55 int *A = (char *)malloc(N * sizeoff(int)) разве тип пойнтера и тип вывода функции malloc не должны совпадать? Разве не должно быть int *A = (int*)malloc(N * sizeoff(int)) ?
@polinakononova8453
@polinakononova8453 2 жыл бұрын
Тоже так подумала
@Al-en6nj
@Al-en6nj Жыл бұрын
подловил
@greenman8625
@greenman8625 4 жыл бұрын
Оп! Не дала! (с) 😅
@allex6829
@allex6829 Жыл бұрын
В какой то момент моя память просто не захотела отказываться, и продолжила выделять
@igorseledtsov7345
@igorseledtsov7345 Жыл бұрын
маллос вообще-то по документации, выделяет не память, а адресное пространство... а память может выделять а может и не выделять.. зависит от операционки
@kirillshvedov8417
@kirillshvedov8417 3 жыл бұрын
Зато честно: 0:31 - 0:38
@irakligagnidze5200
@irakligagnidze5200 Жыл бұрын
Почему массив A не объявлен, как он работает без объявления
@user-mm5ln4qh5q
@user-mm5ln4qh5q Жыл бұрын
объявлен ведь
@keycimag3316
@keycimag3316 5 жыл бұрын
А почему при обьявлении массива ( без маллока) память выделяется в стеке?? Почему не в куче?
@NG-gz9ly
@NG-gz9ly 4 жыл бұрын
От языка зависит , в Java только в heap выделяется , и поэтому программы на яве медленне , а на С/C++ быстрые!
@batfist6595
@batfist6595 4 жыл бұрын
@@NG-gz9ly То есть стек быстрее кучи? То есть, затем нужно объявлять сложные гуи-объекты в стеке? Ради оптимизации? Я познаю дзен
@NG-gz9ly
@NG-gz9ly 4 жыл бұрын
@@batfist6595 Нашел время для коммента
@batfist6595
@batfist6595 4 жыл бұрын
@@NG-gz9ly 2:30 время учиться)
@NG-gz9ly
@NG-gz9ly 4 жыл бұрын
@@batfist6595 Знаешь в ютубе есть чел Winderton , у него плйлист основы программ-ния там все про это говорится
@nicholasspezza9449
@nicholasspezza9449 5 ай бұрын
3 дня Тимофей комп не выключал к моменту записи видео. 🧐
@user-jk9jo1kg9o
@user-jk9jo1kg9o 3 жыл бұрын
игрался с malloc и ставил совершенно безумные цифры. Память на удивление выделялась, но как и почему?
@alexanderkhoroshavin6921
@alexanderkhoroshavin6921 3 жыл бұрын
Какие цифры?
@DD0S2
@DD0S2 3 жыл бұрын
ОС может отказать и без ошибки , понять или выделила можно через оператор выбора
@linterrupt
@linterrupt 3 жыл бұрын
Настоящее горе, это не когда девушка не дает. Настоящее горе, это когда ОC не дает
@Terrarianec
@Terrarianec Жыл бұрын
Как я сюда попал? 😳 Помогите.
@vatemsura
@vatemsura 3 жыл бұрын
У меня жена как операционная система . Тоже имеет полные права и может отказать
@dimalink4486
@dimalink4486 Жыл бұрын
Дима умный! Дима почти закончил этот курс молодого бойца. Для школьников. Следуюбщий урок для меня последний. Почти!! Что то Дим знал. Что то нет. Я вот к прмиеру не пользуюст ПРИНТФ и СКАНФ у меня СТД ИН и АУТ. И я фанат СВИТЧ! Удобная на самом деле штука. Вот не соглашусь что СВИТЧ это плохо. Вот с с логикой и математикой у меня слабо.. Это сложновато. Еще прикол &*Pointer= Pointer; Да! Массив A+10! Я сам пишу обычно *(A+10). Вот это &A[i] = A+I; Еще я это пишу nullptr а тут типа NULL. Как раз по работе с памятью и искал что то для повтора. А потом искал что то чтобы с начала все.
@juvusart
@juvusart 5 жыл бұрын
Мне моя операционка 3Гиб не дала, но я не расстроился, потому-что дала подружка...
@batfist6595
@batfist6595 4 жыл бұрын
Не на линуксе, случайно сидишь?
@batfist6595
@batfist6595 3 жыл бұрын
@Innokentijs Dostovālovs так не бывает. Ты попробуй заполнить при этом выделенную память. Калоком например выдели
@arsenyi9696
@arsenyi9696 4 ай бұрын
13:00 - уважаемый учитель, раньше верно учили, это сейчас в образовании хаос и бардак. ВНИМАНИЕ! Не путайте людей! Один килобайт - 1(kB) = 1024 (B) Байт, один мегабайт - 1 (MB) = 1024 (kB) = 1048576 (B). А этот ваш кибибайт (kiB): 1 (kiB) = 1000 (B) - просто упрощение для (тупых) масс пользователей которых в школе учили что 1 килограмм = 1000 грамм, 1 (км) = 1000 (м)... , а тут на тебе 1 (kB) = 1024 (B). К тому же это оказалось выгодно продавцам памяти и флеш накопителей, чтобы можно было как с продовольственными товарами продавать пачку сока/молока не 1 литр, а 900 мл, 850 мл... ПО ПРЕЖНЕЙ ЦЕНЕ одного литра. Короче и капиталисты/волки сыты (ненадолго) и тупые овцы/потребители без когнитивных диссонансов. Это я вам тут как опытный программист старой школы написал, не ради критики, а на пользу истинным знаниям.
@call_nick
@call_nick 2 ай бұрын
Тоже так думал, пока на Википедию не залез. Видимо зависит от того, какой стандарт дает определение для килобайта и кибибайта.
@korvet348
@korvet348 3 жыл бұрын
Как программист знакомится с девушкой?)
@lenaranalizator6125
@lenaranalizator6125 3 жыл бұрын
Пусть сами знакомятся!
@6bff6dv79
@6bff6dv79 3 жыл бұрын
Никак
@misana77
@misana77 5 жыл бұрын
Там должно быть "OS didn't give", а не "gave")
@batfist6595
@batfist6595 4 жыл бұрын
Gave - прошедшее время, не? ОС же не постоянно не дает память для этой программы, а типа один раз в прошлом.
@user-hr3vf2yh6p
@user-hr3vf2yh6p 4 жыл бұрын
@@batfist6595 В отрицании в past simple глагол надо использовать в первой форме.
@batfist6595
@batfist6595 4 жыл бұрын
@@user-hr3vf2yh6p Ооо, спасибо, не знал
@five4657
@five4657 3 жыл бұрын
Didn’t give, а не didn’t gave)))
@user-apostata
@user-apostata 3 жыл бұрын
врёте, когда я учился в школе такой, киби чуши, не было. вики говорит, что эту дурь придумали в 1999. а до этого 40 лет, все и так понимали друг друга
@AV1ch
@AV1ch 2 жыл бұрын
Более того, до сих пор понимают.
@user-mv5cm1jf9h
@user-mv5cm1jf9h 2 жыл бұрын
Противно слушать голос
@n1ghtlyy396
@n1ghtlyy396 Жыл бұрын
вы неадекватны.
Двумерные массивы в Си: обычные и динамические
21:49
Тимофей Хирьянов
Рет қаралды 71 М.
Increíble final 😱
00:37
Juan De Dios Pantoja 2
Рет қаралды 113 МЛН
I CAN’T BELIEVE I LOST 😱
00:46
Topper Guild
Рет қаралды 81 МЛН
Функции в языке Си
27:17
Тимофей Хирьянов
Рет қаралды 44 М.
Техника безопасности при работе с памятью в Си
19:25
Тимофей Хирьянов
Рет қаралды 34 М.
Зачем нужны указатели в C++?
8:14
Dima
Рет қаралды 1,8 М.
Примеры рекурсивных алгоритмов
23:54
Тимофей Хирьянов
Рет қаралды 57 М.
Адреса и указатели в Си. Адресная арифметика
27:47
Тимофей Хирьянов
Рет қаралды 160 М.
Increíble final 😱
00:37
Juan De Dios Pantoja 2
Рет қаралды 113 МЛН