Тёмный

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

Тимофей Хирьянов
Подписаться 352 тыс.
Просмотров 86 тыс.
50% 1

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

Опубликовано:

 

12 авг 2018

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 115   
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@user-in8cs4me8q
@user-in8cs4me8q Год назад
Под последним Вашим видео отключены комментарии, по этому пишут тут. Хотел выразить свою поддержку и сказать огромное спасибо за работу.
@bishop_ru6767
@bishop_ru6767 4 года назад
Благодарю за лекцию + с уважением, Евген.
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@ImmortalBest
@ImmortalBest 5 лет назад
16Гб ОЗУ ) я думал там ведро с 2Гб и Core2Duo ))нормальная тачка, можно в Unity или Unreal творить ништяки
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@user-tc8dd3nr1f
@user-tc8dd3nr1f 3 года назад
Только благодаря вам узнал про мебибайты и кибибайты.. Спасибо!
@melkorbsd
@melkorbsd Год назад
Кибибайты были введены относительно недавно, в 1998 году, до этого у программистах не возникало проблем использовать разные приставки "кило" и "мега" в программировании и физике:) А потом им вдруг сложно стало.
@v_chelnik
@v_chelnik 2 года назад
Спасибо вам, Тимофей, из школы 21!
@user-dq6iw4sm4k
@user-dq6iw4sm4k Год назад
Попал на основу?
@Utars
@Utars Год назад
Какой город? Случайно не Новосибирск?
@v_chelnik
@v_chelnik Год назад
@@Utars Казань
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@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 есть в стандарте, так что всё ок)
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@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!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@popopopo8317
@popopopo8317 2 года назад
Отлично объясняете)
@artofbarto
@artofbarto 2 года назад
крутой препод, спасибо!
@video0607
@video0607 2 года назад
Спасибо Тимофей!
@kovesik
@kovesik 5 лет назад
Ворнинга на 6:00 нет потому что Си неявно преобразует указатели.
@tacowilco7515
@tacowilco7515 4 года назад
10:21 "OS didn't give ..."
@user-ku8jc7lt9b
@user-ku8jc7lt9b 3 года назад
"... a flying f*ck". xD
@alexs7952
@alexs7952 Год назад
OS didn't gave memory - неправильно. Правильно didn't give.
@user-ui5yh1qp4f
@user-ui5yh1qp4f 6 месяцев назад
отличный урок😍👍
@user-yd1bj3hn8d
@user-yd1bj3hn8d 5 лет назад
А что насчет realloc'a?
@truebrostory5723
@truebrostory5723 3 года назад
Лучший!
@RG-sj1jb
@RG-sj1jb Год назад
Спасибо за лекцию! Вопрос: после освобождения памяти free(A) мы же не сможем обращаться к массиву? зачем тогда освобождать, если нельзя продолжить работу с массивом?
@semyonarteev3100
@semyonarteev3100 Год назад
чтобы он не занимал память процесса
@yuliyacher67
@yuliyacher67 Год назад
Спасибо!
@user-nd4sl1lp9b
@user-nd4sl1lp9b 4 месяца назад
А правда ли,что в си++ можно не парится за утечку памяти из кучи?Там всё происходит почти автоматически(библиотека stl).И нет необходимости следить за каждым шагом работы с динамической памятью?
@MaxPV1981
@MaxPV1981 Год назад
Тимофей, вопрос по 26 минуте: - Всё же указатели можно сравнивать, как я понимаю - просто бессмысленно в свете предполагаемой цели, так как даст некорректные значения? Разве нельзя придумать задачу, по которой нужно сравнивать именно указатели из разных областей памяти - ну, исследует человек пространство памяти, что такого? :)
@user-bv8wy8cn7o
@user-bv8wy8cn7o Год назад
А почему в начале видео не используется free( ) для освобождения памяти?
@roman6572
@roman6572 Год назад
Норм то, что там где выделяем память, при водим void* к char* и присваиваем переменной int*?
@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 млрд.
@greenman8625
@greenman8625 4 года назад
Оп! Не дала! (с) 😅
@kirillshvedov8417
@kirillshvedov8417 3 года назад
Ну чтоб подождать)) 3:17
@michaeljordan1283
@michaeljordan1283 Год назад
7:50 память возвращается системе - без функции free()?
@keycimag3316
@keycimag3316 4 года назад
А почему при обьявлении массива ( без маллока) память выделяется в стеке?? Почему не в куче?
@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 , у него плйлист основы программ-ния там все про это говорится
@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; }
@jojomajo
@jojomajo 4 года назад
Она постоянно не даёт, что-то вечно растет и падает, система не выдерживает выдает ошибки, все прям как в жизни)
@AnonIm-if3cw
@AnonIm-if3cw 3 года назад
int *A = (char *)malloc(N*sizeof(int)) - я один заметил, что там (char *) лишний🤔
@polinakononova8453
@polinakononova8453 2 года назад
int* должно быть, если правильно понимаю
@user-cm1ri1sn2u
@user-cm1ri1sn2u 7 месяцев назад
Тимофей, с did используется глагол в форме инфинитива, didn't gAve - неправильно.
@nicholasspezza9449
@nicholasspezza9449 4 месяца назад
в данном случае "неправильно" должно писаться слитно, грамотей 🐒
@user-cm1ri1sn2u
@user-cm1ri1sn2u 4 месяца назад
@@nicholasspezza9449 благодарю за ликбез. Исправил
@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 Год назад
подловил
@user-jk9jo1kg9o
@user-jk9jo1kg9o 3 года назад
игрался с malloc и ставил совершенно безумные цифры. Память на удивление выделялась, но как и почему?
@alexanderkhoroshavin6921
@alexanderkhoroshavin6921 3 года назад
Какие цифры?
@DD0S2
@DD0S2 3 года назад
ОС может отказать и без ошибки , понять или выделила можно через оператор выбора
@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; } а если убрать задержку то видно как он резко взлетает как квадратичная функция
@igorseledtsov7345
@igorseledtsov7345 Год назад
маллос вообще-то по документации, выделяет не память, а адресное пространство... а память может выделять а может и не выделять.. зависит от операционки
@irakligagnidze5200
@irakligagnidze5200 Год назад
Почему массив A не объявлен, как он работает без объявления
@user-mm5ln4qh5q
@user-mm5ln4qh5q Год назад
объявлен ведь
@misana77
@misana77 5 лет назад
sizeof - это оператор, а не функция
@tkhirianov
@tkhirianov 5 лет назад
Вы правы. Просто меня учили, что это "функция, вычисляемая в момент компиляции", а по первоисточникам я не могу всю терминологию проверять. К счастью, это не меняет сути дела. На будущее учту вашу поправку.
@linterrupt
@linterrupt 3 года назад
Настоящее горе, это не когда девушка не дает. Настоящее горе, это когда ОC не дает
@alexanderm6862
@alexanderm6862 4 года назад
Просящему даётся, с операционной системой как с женщиной
@the_byte.
@the_byte. 2 года назад
да, в чём-то они похожи..
@user-ii1td7iq5j
@user-ii1td7iq5j 3 года назад
😎😎😎😎
@allex6829
@allex6829 Год назад
В какой то момент моя память просто не захотела отказываться, и продолжила выделять
@kirillshvedov8417
@kirillshvedov8417 3 года назад
15:36
@nicholasspezza9449
@nicholasspezza9449 4 месяца назад
3 дня Тимофей комп не выключал к моменту записи видео. 🧐
@kirillshvedov8417
@kirillshvedov8417 3 года назад
Зато честно: 0:31 - 0:38
@vatemsura
@vatemsura 3 года назад
У меня жена как операционная система . Тоже имеет полные права и может отказать
@user-apostata
@user-apostata 3 года назад
врёте, когда я учился в школе такой, киби чуши, не было. вики говорит, что эту дурь придумали в 1999. а до этого 40 лет, все и так понимали друг друга
@AV1ch
@AV1ch 2 года назад
Более того, до сих пор понимают.
@Terrarianec
@Terrarianec 10 месяцев назад
Как я сюда попал? 😳 Помогите.
@arsenyi9696
@arsenyi9696 3 месяца назад
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 Месяц назад
Тоже так думал, пока на Википедию не залез. Видимо зависит от того, какой стандарт дает определение для килобайта и кибибайта.
@korvet348
@korvet348 3 года назад
Как программист знакомится с девушкой?)
@lenaranalizator6125
@lenaranalizator6125 3 года назад
Пусть сами знакомятся!
@6bff6dv79
@6bff6dv79 3 года назад
Никак
@juvusart
@juvusart 5 лет назад
Мне моя операционка 3Гиб не дала, но я не расстроился, потому-что дала подружка...
@batfist6595
@batfist6595 4 года назад
Не на линуксе, случайно сидишь?
@batfist6595
@batfist6595 3 года назад
@Innokentijs Dostovālovs так не бывает. Ты попробуй заполнить при этом выделенную память. Калоком например выдели
@dimalink4486
@dimalink4486 Год назад
Дима умный! Дима почти закончил этот курс молодого бойца. Для школьников. Следуюбщий урок для меня последний. Почти!! Что то Дим знал. Что то нет. Я вот к прмиеру не пользуюст ПРИНТФ и СКАНФ у меня СТД ИН и АУТ. И я фанат СВИТЧ! Удобная на самом деле штука. Вот не соглашусь что СВИТЧ это плохо. Вот с с логикой и математикой у меня слабо.. Это сложновато. Еще прикол &*Pointer= Pointer; Да! Массив A+10! Я сам пишу обычно *(A+10). Вот это &A[i] = A+I; Еще я это пишу nullptr а тут типа NULL. Как раз по работе с памятью и искал что то для повтора. А потом искал что то чтобы с начала все.
@five4657
@five4657 3 года назад
Didn’t give, а не didn’t gave)))
@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 Ооо, спасибо, не знал
@user-mv5cm1jf9h
@user-mv5cm1jf9h 2 года назад
Противно слушать голос
@n1ghtlyy396
@n1ghtlyy396 Год назад
вы неадекватны.
Далее
Что-то пошло не так 😂
00:15
Просмотров 493 тыс.
Baxtli bo’l do’stim❤️
00:47
Просмотров 1,2 млн