Стек на языке C

Поделиться
HTML-код
  • Опубликовано: 8 фев 2025
  • Что такое стек. Как хранятся локальные переменные в функциях и процедурах. Пример стека с именованными элементами, позволяющими хранить любые данные.

Комментарии • 51

  • @НикитаНеженцев-и5ы

    Какая же услада для ушей слушать такое приятное и понятное объяснение)

  • @firstlast-lb3yb
    @firstlast-lb3yb 2 года назад +5

    Офигенная дикция и подача материала!
    Прошу вас рассмотреть создание гайдов по опитимизации чего-либо на С для других языков. Мне кажется, это зайдет зрителям.

  • @Blacker-bw3se
    @Blacker-bw3se Год назад +3

    Это шедевр!!! Всё просто, понятно, без лишней воды! Не останавливайся. Было бы неплохо информацию дублировать в текстовом формате в блоге, возможно кому-то воспринимать информацию по видео сложнее, чем в печатном виде.

  • @MSaidu-sj6vx
    @MSaidu-sj6vx Год назад +3

    Боги услышали мои мольбы!!! Русскоязычный сегмент пополнился первоклассным контентом! Всё отлично!Даже прицепиться не к чему!👍👍👍👍👍

  • @АндрейИванов-й5т2ь
    @АндрейИванов-й5т2ь 2 года назад +1

    Заставляешь своим видео сесть за комп и по изучать (вспомнить) поведение программы на низком уровне. Показ программы на Си, ее дизассемблирование и синхронный анализ - ценный контент. Благодарю за видео.

  • @-__-5262
    @-__-5262 2 года назад +2

    Это очень классное и качественное видео, буду с удовольствием ждать новые видео👍

  • @ИльдарБулатов-т4х
    @ИльдарБулатов-т4х 2 года назад +3

    Интересно и доступно объясняешь

  • @dmitry.shpakov
    @dmitry.shpakov 2 года назад

    Спасибо за видео! Было интересно.

  • @albertnikitin8071
    @albertnikitin8071 Год назад +1

    Пожалуй, лучший материал по Си на русском ютубе! А можешь пожалуйста объяснить зачем в .c файле код в #ifndef? Я учусь в школе программирования, и в первый раз вижу такой стиль. Может направишь на сторонний материал, чтобы это понять. Про стековый кадр и регистры bp sp тоже конечно интересно))

    • @albertnikitin8071
      @albertnikitin8071 Год назад

      То есть я знаю, что это деректива препроцессора, которая означает что, если define *.c не определен, то его нужно определить, но все равно не понимаю зачем это в Си файле. До этого видел такую конструкцию только в хедерах. И еще вопрос, где все же лучше подключать библиотеки? В Си файлах или в хедерах? У меня на учебе поголовно все делают это в хедере. Это просто кто как предпочитает? Или же есть какой-то моветон?

    • @tripledistillation1755
      @tripledistillation1755  Год назад +1

      #ifndef в си файле возможно и не требуется. Общий смысл такой конструкции - избегание повторного включения заголовочного файла и, соответственно, повторного определения структур, типов данных и т.д.. Подобный стиль оформления я встретил в книге по Borland C++.
      Если под подключением библиотеки имеется в виду конструкция #include, то всё зависит от ситуации. Если рассмотреть подключение какой-нибудь сторонней библиотеки, то в её хедере есть только те директивы #include, которые требуются для определения необходимых ей типов данных. Хотя сама библиотека может использовать другие модули, подключая их заголовочные файлы в своей реализации (внутри .c). Хедер (заголовочный файл) - это ещё и "интерфейс" для тех, кто захочет воспользоваться библиотекой (или модулем). На мой взгляд, нет необходимости указывать определения тех конструкций, которые используются только "под капотом".

  • @ZuraevD
    @ZuraevD Год назад

    Так атмосферно

  • @DenisTrebushnikov
    @DenisTrebushnikov Год назад

    Я в восторге от простоты объяснения! Я узнал о семантике и синтаксисе Си больше, чем за 300 страниц книги по Си. Как я понимаю, стек в сути - это односторонний связный список? И второй вопрос: размер передаваемой для выделения памяти должно как-то коррелировать с размером машинного слова для ускорения работы стека?

    • @tripledistillation1755
      @tripledistillation1755  Год назад +2

      Стек не обязательно является списком. Односторонний связанный список - это один из вариантов реализации. Стеком вполне может быть массив. Суть в порядке чтения/удаления и записи/добавления элементов.
      В данном видео стек-список - это абстрактная структура, сильно отличающаяся от того же стека программы (что в примере с объектным кодом). Цель сравнения в выделении существенных признаков стека как такового. Относительно второго вопроса можно вспомнить, что в структурах (struct) по умолчанию установлено выравнивание в 4 байта для элементов , что помогает оптимизировать работу компилятора. Будет ли лучше работать оптимизация, если применить подобный метод для памяти - трудно сказать.

  • @SerjCrimea
    @SerjCrimea Год назад

    Дааа, я учил Pascal потом на Delphi перешел в 90х. Как в Си все сложно! Зная что есть намного легче путь ;)

    • @tripledistillation1755
      @tripledistillation1755  11 месяцев назад

      Иногда возникает желание углубиться в детали) Си даёт такую возможность

    • @SerjCrimea
      @SerjCrimea 11 месяцев назад

      @@tripledistillation1755 Да, познавая на Си алгоритм LZW я это прочувствовал =)

  • @ДмитрийМакеев-с6м

    Сделай, пожалуйста, продолжение про стековый кадр и регистры. И ещё момент: пробую переписывать твои уроки сразу в открытое окно редактора при запущенном видео (думаю, так многие тут делают). Немного не удобно, что текст на видео располежен строго по середине, и окно редактора приходится вжимать в правую область экрана, сильно ограничивая обзор. Не мог бы ты в последующих уроках немного сместить текст влево (немного сократив ширину фпейма с директорией проекта, например)? Но всё равно спасибо за уроки, они очень помогают!

  • @falmrom
    @falmrom 2 года назад

    Очень интересно

  • @kotvkvante22
    @kotvkvante22 2 года назад

    Круто

  • @ЭлФанатик
    @ЭлФанатик Год назад

    стек в Си. В смысле стек в куче на Си :Ь.
    А я то подумал тут про работу кэшами памяти будет

  • @kirillkaleda5798
    @kirillkaleda5798 Год назад

    а почему мы не очищаем указатель next, когла удаляем элемент из стека?

    • @tripledistillation1755
      @tripledistillation1755  11 месяцев назад

      Если мы это сделаем, то удалим информацию о следующем элементе, потеряв таким образом связь с его содержимым

  • @nRADRUS
    @nRADRUS Год назад

    7:00 ну вообще-то это виртуальный стек, а не настоящий. То есть на самом деле реализация является связным списком. А чтобы сделать стек, надо сразу выделить память на весь стек, и уже в нём копаться как массиве структур с обратным индексом, и с указателями.

    • @tripledistillation1755
      @tripledistillation1755  Год назад

      Так и есть. Я взял самое общее определение из тех, что нашел. А реализация подобрана так, чтобы использовать её в последующих проектах

    • @Pavel_Leonidovich
      @Pavel_Leonidovich 9 месяцев назад

      А если потом не хватит емкости стека? И что такое настоящий стек? :-)

  • @bogdanwitcher3226
    @bogdanwitcher3226 Год назад +1

    А можно подробный разбор указатель🙏🙏🙏

    • @tripledistillation1755
      @tripledistillation1755  Год назад

      Что такое "указатель"? Это имеется в виду?

    • @bogdanwitcher3226
      @bogdanwitcher3226 Год назад

      ​@@tripledistillation1755 ну да, но хочется глобально что-то, ведь у нас массив это указатель, в стеках указатели, можно функции делать на указатели, почему мы, если в функцию хотим передать массив, то передаем именно указатель, почему если мы имеем int* a и int* b то если сделать b = a, а потом менять b то и а поменяется, ну вот что-то такое, потому что, как я понял, указатели это вообще очень основополагающая тема, а каких-то толковых разборов нет(

    • @kolyaserebryakov4898
      @kolyaserebryakov4898 Год назад

      Ага, хотелось бы, весь мехмат на Вас подпишется

    • @bogdanwitcher3226
      @bogdanwitcher3226 Год назад

      @@kolyaserebryakov4898 ой ё ёй, а это кста да

    • @tripledistillation1755
      @tripledistillation1755  Год назад +1

      Очень приятно знать, что есть зрители с мехмата.

  • @eugenedukatta9355
    @eugenedukatta9355 Год назад

    Для какого процессора приведен листинг? Это совсем не похоже на x86 ?

  • @ВладиславГришин-ш7ш

    для чего делать free отдельно для sn->name, sn->data если в конце концов делаем free для sn ?

    • @tripledistillation1755
      @tripledistillation1755  2 года назад +3

      sn, sn->name и sn->data - это указатели на три разных области памяти. Все три области выделены динамически и ни одна из них не является частью другой. Следовательно, free для sn не повлечет за собой освобождение двух других областей.
      Представьте, что у вас есть огромная кладовка, в которой имеется банка с огурцами и, где-то ещё, банка с помидорами. В руках вы держете записную книжку, в которой указаны места расположения банок. Если сразу выбросить книжку, банки никуда не денутся, но найти их будет сложновато. А вот если по записям найти продукты и достать их из кладовки, то книжка вам больше не нужна, так как описывает то, чего нет. Тут sn - указатель на книжку, sn->name - на огурцы, sn->data - на помидоры)
      Обойтись одной процедурой free(sn) можно тогда, когда значения указателей sn->name и sn->data получены напрямую от пользователя и он берет ответственность за их природу. Код модуля уменьшится, но в этом случае стек будет лишь вносить порядок в существующий набор данных, а пользователю придется тратить время на "обвязку" и просчет возможных ошибок.
      В Java, например, можно присвоить переменной значение nil, а "сборщик мусора" сам удалит из памяти то, на что нет ни одной ссылки в коде.
      В C никто не будет следить за утечками памяти, кроме самого программиста. Это, на мой взгляд, очень важный "воспитующий" фактор, заставляющий вникать в суть вещей.
      Спасибо за вопрос

  • @ОлександрСобінов
    @ОлександрСобінов 2 года назад

    Таки младиж винна навчатитсь у розумних!

  • @afansimaksimenko3337
    @afansimaksimenko3337 Год назад

    Ну не видно же!!!

  • @stasuchuvadov
    @stasuchuvadov Год назад

    Ожидал общепринятый стек технологий для построения приложений профессионального уровня

    • @tripledistillation1755
      @tripledistillation1755  Год назад

      Что подразумевается под стеком технологий для построения приложений профессионального уровня? Какие существуют критерии для приложений, чтобы зафиксировать этот профессиональный уровень? Общепринятый в каком масштабе? Я не профессионал, поэтому было бы интересно узнать

    • @nRADRUS
      @nRADRUS Год назад

      для профессионального уровня в интернете почти ничего нет! даже стандартные библиотеки все в говне! все хорошие библиотечки не выходят за рамки коммерческих фирм.

    • @tripledistillation1755
      @tripledistillation1755  Год назад

      @@nRADRUS Хороши ли библиотеки в рамках коммерческих фирм - вопрос спорный. Со стороны обыкновенного пользователя "профессиональное приложение" - это очередной новый мессенджер со старым функционалом, но зато кладущий на лопатки более мощный процессор.

    • @stasuchuvadov
      @stasuchuvadov Год назад

      Странно, я вроде оставлял ответ, даже с ссылками на материалы
      Под стеком технологий я имел в виду набор технологий, используемые при разработке приложении. Для веб приложений со стороны бэка это обычно веб фреймворк + орм/query builder. Если смотреть в контексте всего приложения и его работы, то я бы сказал ось + веб сервер + бд (часто можно слышать про LAMP).
      Не знаю, если честно, какие есть для сишки варианты, для шарпа могу назвать ASP NET + EFCore/NHibernate/Raw queries.
      Есть еще такая вещь, как DI, в шарпе и Java в основном видел, в плюсах hydra есть, но я услышал о ней лишь 1 раз

    • @tripledistillation1755
      @tripledistillation1755  Год назад

      Спасибо. Возьму на заметку

  • @apa64ik
    @apa64ik 2 года назад +1

    бамп

  • @antara3164
    @antara3164 2 года назад

    бамп