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

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

КОМЕНТАРІ • 56

  • @k777ig
    @k777ig 4 роки тому +30

    Огромное спасибо. Ну реально препод от бога. Люди не жлобите лайк, материал ведь годный)

  • @user-mb9fj2py5g
    @user-mb9fj2py5g 3 роки тому +4

    У тебя самые классные и максимально понятные уроки по Си

  • @bishop_ru6767
    @bishop_ru6767 4 роки тому +2

    Благодарю за урок + с уважением, Евген.

  • @user-lo2ue9zp7k
    @user-lo2ue9zp7k 3 роки тому +2

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

  • @Ilya1510
    @Ilya1510 4 роки тому +5

    Хорошие уроки, автору канала респект

  • @okhramkov
    @okhramkov 2 роки тому +8

    Вот только то сколько памяти занимает указатель не постоянная величина, а зависящая от размера компьютерного слова. На системах с разрядностью 32 это, и в правду, 4, а вот когда разрядность 64 размер указателя уже будет 8.

    • @ulysses.apokin
      @ulysses.apokin 2 роки тому +2

      у меня х64, все равно 4

    • @ART-zp5bh
      @ART-zp5bh 2 роки тому +1

      да, это вроде бы называется шиной адреса процессора

    • @erzhan225
      @erzhan225 2 місяці тому

      @@ART-zp5bh длина машинного слова

  • @user-ic2wx3qw1w
    @user-ic2wx3qw1w 4 роки тому +15

    Прошу заметить что функция free не возвращает бесплатную картошку фри!

    • @user-ic2wx3qw1w
      @user-ic2wx3qw1w 4 роки тому +3

      Комментарий не имеет никакого смысла, кроме развлекательного, для помощи канала Антона!

    • @dicktv8810
      @dicktv8810 8 місяців тому

      Может. Ведь в маллоке может храниться любая информация)

  • @ylikitishnik1946
    @ylikitishnik1946 3 роки тому +2

    while(1)
    {
    printf("top!");
    cout

  • @user-sy2dy7or1q
    @user-sy2dy7or1q 2 роки тому

    отличный контент

  • @bark205
    @bark205 3 роки тому

    Тоха лучший!

  • @marspriyom
    @marspriyom Рік тому +2

    указатель может занимать 8 байт смотря какая архитектура

  • @yuliyacher67
    @yuliyacher67 Рік тому

    Спасибо!

  • @jetbrain9115
    @jetbrain9115 3 роки тому

    Отлично!

  • @sergepisarsky2038
    @sergepisarsky2038 Рік тому +2

    Одно замечание. Новичкам трудно иногда уследить за мыслью при таком темпе изложения.

    • @user-fv8uv2us9r
      @user-fv8uv2us9r Рік тому +1

      Ага, особенно когда человек склонен терять концентрацию и задумывается о своём, как я)
      -это проблема ученика, а не учителя..?-
      А ещё лично я лучше понимаю на картинках и реальных примерах - беря в пример какие-то функции игр, например..
      Кстати, для лучшего усвоения можно включить субтитры и/или замедлить скорость и вслушиваться, смотря в пустоту, представляя сказанное, т.к. изображение перед гладит может привлекать внимание и, ну, мешать
      Ну.. Или ещё как вариант - остановить воспроизведение, подумать о чём нужно, глубоко подышать (помедитировать, сконцентрироваться) и продолжить xD
      С другой стороны.. Если совсем уж никак настроиться - стоит лечь спать и отложить обучение на пробуждение.. 🤔

  • @vanjabagdasaryan2160
    @vanjabagdasaryan2160 2 роки тому

    МОЛОДЕЦ.

  • @Purpursarkans
    @Purpursarkans 4 роки тому +1

    лучший

  • @user-nd4sl1lp9b
    @user-nd4sl1lp9b 8 місяців тому

    Немогу понять зачем нужно в си работать с кучей(ведь столько много требований синтаксиса с динамической памятью),ведь уже написан си++(где это на много проще) ,который в автоматическом режиме контролирует,что бы не было утечки памяти по неосторожности программиста?

  • @temirkhanamanbaev42
    @temirkhanamanbaev42 3 роки тому +2

    Антон что будет если я укажу меньше байт необходимого указателю, например 2 вместо 4?

    • @beginend95
      @beginend95  3 роки тому +3

      Будет большая вероятность получить плавающую ошибку, которую очень трудно найти и исправить. Лучше так не делать)

    • @temirkhanamanbaev42
      @temirkhanamanbaev42 3 роки тому +2

      @@beginend95 Все понял спасибо!

  • @user-uw1on7ll4z
    @user-uw1on7ll4z Рік тому

    в 32 разрядной системе указатель занимает 4 байта, в 64 разрядной 8
    завтра на 8 разрядном стм 8 запущу , интересно что будет, тк однобайтовый указатель бредово звучит, тк объем оперативки там килобайт)

    • @teflonatr9052
      @teflonatr9052 Рік тому

      Привет! И что получилось в итоге? Интересно же :) Спасибо заранее.

  • @cytorak875
    @cytorak875 3 роки тому +2

    Антош, а почему ты не рассказал, что желательно в int main() вписывать в аргументы void, в плюсах понятно, что когда ты оставляешь мейн фукнцию без аргументов это значит, что для функции не разрешены параметры. В практике бывали ворнинги от компилятора, когда main оставался без void

    • @beginend95
      @beginend95  3 роки тому

      Честно говоря, я про это забыл. Благодарю за замечание)

    • @cytorak875
      @cytorak875 3 роки тому +2

      @@beginend95 рабочие моменты, будешь продолжать плейлист?) Всем, кто будет читать это, вот вам хороший совет: Всегда указывать аргумент void в int main (). Потому что такие компиляторы как clang, amd x86 open64 compiler suite, open watcom, digital mars (dm чаще пишут), часто ругаются за отсутствие void в качестве аргумента в ведущей функции! В плюсах можете об этом забыть, там все лучше

    • @beginend95
      @beginend95  3 роки тому +1

      @@cytorak875 Да, в есть планах несколько тем. Но сначала ОпенГЛ, а потом С++.

    • @cytorak875
      @cytorak875 3 роки тому

      @@beginend95 понял, спасибо большое) надо будет опенгл посмотреть, не разу не работал с ним

    • @cytorak875
      @cytorak875 3 роки тому

      @@user-nt2zf4ex1b вообще да, но как я и написал выше это свойственно лишь некоторым компиляторам, в gcc, icc, clang этого нет не сегодняшний день. Если вы используете какой-то DM, то там это возможно, хотя в настоящий момент этого может и не быть

  • @ashesha391
    @ashesha391 2 роки тому

    Зачем в функцию malloc вставлять метод sizeof, ведь все указатели любого типа занимают 4 байта, почему нельзя просто указать 4?

    • @beginend95
      @beginend95  2 роки тому +3

      потому что мы выделяем память не для адреса (указателя), а для ячейки памяти определенного типа, которая хранит значение (например int). Если будет char *c, то нужно будет выделить всего 1 байт. + Нам может понадобиться выделить память для структуры.

  • @dauletalmas7591
    @dauletalmas7591 3 роки тому +1

    А почему в девятой строке не выдаёт никаких ошибок? Там должно быть приведение типов (int*) перед функцией malloc . У меня только так сработало.

    • @beginend95
      @beginend95  3 роки тому

      В языке Си использование указателя void* не требует применения явного преобразования. Возможно ты что-то настраивал в среде.

    • @dauletalmas7591
      @dauletalmas7591 3 роки тому +2

      @@beginend95 Понял. Я в проекте с++ писал, может из-за этого.

  • @weekendshow7567
    @weekendshow7567 Рік тому

    почему на экран выводится 333??? Ведь условие содержит, что на экран вывести 333, если х != NULL. Но ведь int *х = NULL на строке 9!!!

    • @mylordmilord
      @mylordmilord Рік тому

      такой же вопрос

    • @teflonatr9052
      @teflonatr9052 Рік тому

      Присоединяюсь к вопросу.

  • @elliotalderson6609
    @elliotalderson6609 3 роки тому +3

    sizeof это оператор, а не функция

    • @erzhan225
      @erzhan225 2 місяці тому

      оператор и есть функция

  • @ostrov11
    @ostrov11 4 роки тому +3

    Комментарий

    • @beginend95
      @beginend95  4 роки тому +4

      благодарю за поддержку!)

  • @temirkhanamanbaev42
    @temirkhanamanbaev42 3 роки тому +1

    Почему у меня все равно показывает 8 байт вместо 4?

    • @beginend95
      @beginend95  3 роки тому +2

      В 64 разрядных приложениях указатель занимает 8 байт.
      В 32 разрядных - 4 байта.

    • @temirkhanamanbaev42
      @temirkhanamanbaev42 3 роки тому +2

      @@beginend95 Спасибо!

  • @smeh_noi
    @smeh_noi 2 роки тому

    Компилятор упорно выдаёт ошибку и отказывается присваивать и выводить значение строке.
    Можете подсказать в чем проблема?
    char *z = NULL;
    z = malloc(sizeof(char));
    if ( z != NULL){
    *z = "tree";
    printf("%s
    ", *z);
    }

    • @MC-hd5eb
      @MC-hd5eb 2 роки тому +4

      Ты выделил память под 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

  • @nokia_n-gage
    @nokia_n-gage Рік тому +1

    Комментарий

  • @yrikitishnik1680
    @yrikitishnik1680 2 роки тому +1

    Комментарий

  • @yrikitishnik1680
    @yrikitishnik1680 2 роки тому +1

    Комментарий