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

แชร์
ฝัง
  • เผยแพร่เมื่อ 23 ธ.ค. 2024

ความคิดเห็น • 59

  • @k777ig
    @k777ig 4 ปีที่แล้ว +30

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

  • @МаксимПопов-ц2в
    @МаксимПопов-ц2в 3 ปีที่แล้ว +4

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

  • @bishop_ru6767
    @bishop_ru6767 4 ปีที่แล้ว +2

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

  • @SAM-t6k7s
    @SAM-t6k7s 3 ปีที่แล้ว +2

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

  • @Ilya1510
    @Ilya1510 4 ปีที่แล้ว +5

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

  • @bark205
    @bark205 3 ปีที่แล้ว

    Тоха лучший!

  • @yuliyacher67
    @yuliyacher67 2 ปีที่แล้ว

    Спасибо!

  • @vanjabagdasaryan2160
    @vanjabagdasaryan2160 2 ปีที่แล้ว

    МОЛОДЕЦ.

  • @Purpursarkans
    @Purpursarkans 4 ปีที่แล้ว +1

    лучший

  • @ЕвгенийГончаров-м9ч
    @ЕвгенийГончаров-м9ч 3 ปีที่แล้ว

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

  • @jetbrain9115
    @jetbrain9115 3 ปีที่แล้ว

    Отлично!

  • @ylikitishnik1946
    @ylikitishnik1946 3 ปีที่แล้ว +2

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

  • @marspriyom
    @marspriyom 2 ปีที่แล้ว +3

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

  • @okhramkov
    @okhramkov 3 ปีที่แล้ว +8

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

    • @ulyssesaa
      @ulyssesaa 2 ปีที่แล้ว +2

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

    • @ART-zp5bh
      @ART-zp5bh 2 ปีที่แล้ว +1

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

    • @erzhan225
      @erzhan225 6 หลายเดือนก่อน

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

  • @lievsey
    @lievsey 2 หลายเดือนก่อน

    Если пытаюсь присвоить что-то нетипизированному указателю, пишет что неприсваиваемый тип войд:
    void* a = malloc(sizeof(int));
    *a = 13;
    Компилятор ругается, так же и при попытке вывести через принтф данные по адресу *a

  • @ДмитрийКошелев-п5э
    @ДмитрийКошелев-п5э 4 ปีที่แล้ว +15

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

    • @ДмитрийКошелев-п5э
      @ДмитрийКошелев-п5э 4 ปีที่แล้ว +3

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

    • @dicktv8810
      @dicktv8810 11 หลายเดือนก่อน

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

  • @temirkhanamanbaev42
    @temirkhanamanbaev42 3 ปีที่แล้ว +2

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

    • @beginend95
      @beginend95  3 ปีที่แล้ว +3

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

    • @temirkhanamanbaev42
      @temirkhanamanbaev42 3 ปีที่แล้ว +2

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

  • @ИринаИрина-ш5ы7р
    @ИринаИрина-ш5ы7р ปีที่แล้ว

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

  • @sergepisarsky2038
    @sergepisarsky2038 2 ปีที่แล้ว +2

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

    • @миииц
      @миииц 2 ปีที่แล้ว +1

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

  • @dauletalmas7591
    @dauletalmas7591 4 ปีที่แล้ว +1

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

    • @beginend95
      @beginend95  4 ปีที่แล้ว

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

    • @dauletalmas7591
      @dauletalmas7591 4 ปีที่แล้ว +2

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

  • @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 ปีที่แล้ว

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

  • @ПетрКрупин-ф8ж
    @ПетрКрупин-ф8ж ปีที่แล้ว

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

    • @teflonatr9052
      @teflonatr9052 ปีที่แล้ว

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

  • @SardorMirzorakhimov
    @SardorMirzorakhimov 10 วันที่ผ่านมา

    "Процедура free, как картошка только процедура."))

  • @ashesha391
    @ashesha391 2 ปีที่แล้ว

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

    • @beginend95
      @beginend95  2 ปีที่แล้ว +3

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

  • @elliotalderson6609
    @elliotalderson6609 4 ปีที่แล้ว +4

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

    • @erzhan225
      @erzhan225 6 หลายเดือนก่อน

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

  • @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 символ, а поместить туда пытаешься строку

    • @qwertdim
      @qwertdim 27 วันที่ผ่านมา

      ​@@MC-hd5ebэто происходит по другой причине. Если выделить необходимый размер памяти, то тоже ошибку выдаст. Один массив в другой только через цикл можно скопировать.

  • @weekendshow7567
    @weekendshow7567 2 ปีที่แล้ว

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

    • @mylordmilord
      @mylordmilord ปีที่แล้ว

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

    • @teflonatr9052
      @teflonatr9052 ปีที่แล้ว

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

  • @ЛирикГорбун
    @ЛирикГорбун 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.");
    }
    }

  • @ostrov11
    @ostrov11 4 ปีที่แล้ว +3

    Комментарий

    • @beginend95
      @beginend95  4 ปีที่แล้ว +4

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

  • @yrikitishnik1680
    @yrikitishnik1680 2 ปีที่แล้ว +1

    Комментарий

  • @yrikitishnik1680
    @yrikitishnik1680 2 ปีที่แล้ว +1

    Комментарий

  • @nokia_n-gage
    @nokia_n-gage 2 ปีที่แล้ว +1

    Комментарий