#51. Функции malloc(), free(), calloc(), realloc(), memcpy() и memmove() | Язык C для начинающих

Поделиться
HTML-код
  • Опубликовано: 13 дек 2024

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

  • @andrey_sautenko
    @andrey_sautenko Год назад +6

    какая чудесная функция realloc()! и расширит, и скопирует, и подчистит.
    очень интересный урок,спасибо Сергей!

  • @MrLeyt1125
    @MrLeyt1125 10 месяцев назад +3

    Спасибо за твои труды! Хорошо и подробно все объясняешь, в отличии от многих других курсов :)

  • @donlinoleum831
    @donlinoleum831 Год назад +5

    Вот это уже серьезные дела) Спасибо за видео!

  • @AlexRootx
    @AlexRootx Год назад +5

    как всегда, лайк, за качественную подачу материала!!!

  • @ВладимирНазарчук-ц8е

    Очень полезное видео. Спасибо! Именно так и работает контейнер vectot из C++

  • @mihail8159
    @mihail8159 9 месяцев назад +1

    Курс вообще топ, всем советую , для начинающих ❤❤❤❤

  • @andredru4278
    @andredru4278 10 месяцев назад +1

    Спасибо. Трудно представить более простое объяснение

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

    Роскошно.

  • @ЕкатеринаНевзорова-й7е

    Классно, спасибо!

  • @alekskapitonov2738
    @alekskapitonov2738 6 месяцев назад +1

    Спасибо.

  • @c.d.e5852
    @c.d.e5852 Месяц назад +1

    объясняя функцию void* append() проехался без остановки. еще и ускоряя речь, словно щас забудет мысль
    за то про кучу полторы минуты топтались - "благосклонен", "полновластный хозяин"

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

    Вот эта штука выглядит плохо (и в левой и в правой части есть data) =>
    data = append(data, &length, &capacity ...
    Можно использовать указатель на указатель, в его значении хранить адрес массива, а в функцию передавать адрес этого указателя.
    unsigned int dataPtr = (unsigned int)data;
    for(char i=1; i

  • @734833
    @734833 Год назад +6

    My brain ram got overflow error.

  • @РусланКарнеенко
    @РусланКарнеенко 9 месяцев назад +1

    Сложный урок. Спасибо

  • @olegafrikyan5859
    @olegafrikyan5859 5 месяцев назад +1

    Спасибо большое за видео!
    Мы можем выделять отдельно память с помощью realloc под каждый новый элемент массива? Я попробовал, получилось. Вводим элементы, пока не будет введено -1. Вот код:
    #include
    #include
    int main(){
    int* arr = NULL;
    int n;
    int i = 0;

    scanf("%d", &n);
    while (n != -1) {
    arr = realloc(arr, sizeof(int));
    arr[i] = n;
    i++;
    scanf("%d", &n);
    }
    for (int j = 0; j < i; j++) {
    printf("%d ", arr[j]);
    }
    free(arr);
    return 0;
    }

  • @ГущинАндрей-ч5ы
    @ГущинАндрей-ч5ы Год назад +3

    Здравствуйте. Долго ждал урока с материалами по работе с кучей. Объяснения очень полезны, даже приведён такой прикладной пример.
    Я хотел спросить у Вас совета. Я бы хотел выделить выровненную память в куче, скажем, по адресу, кратному 64. После того, как использовал эту память, мне захотелось изменить её размер, при этом сохранив выравнивание. Если новый размер меньше предыдущего, то функция realloc удовлетворит моим требованиям. Но, если мне понадобится выделить объём памяти больший, то realloc, в лучшем случае, сможет захватить дополнительный кусок на месте, а в худшем - скопирует в новую область. Но тогда и выравнивание, вероятно, потеряется. Как мне кажется, самый простой вариант, если он возможен следующий. Нужно проверить: свободна ли память за границей текущего массива. Если да - применить realloc. Если нет - то выделить malloc’ом в новом месте с запасом на выравнивание и потом уже скопировать туда данные, а старую область освободить.
    Не подскажете: возможно ли осуществить проверку области (возможно перебором адресов) за массивом на занятость? Если да - насколько это по силам программисту по C/C++ с базовыми навыками? Может, существует такая библиотечная функция? Функции aligned_malloc, aligned_realloc, aligned_free не подходят.
    Возможен вариант из Вашего примера без realloc, конечно, но не хотелось бы лишний раз копировать данные в новую область, если возможно захватить последующие адреса.
    Заранее приношу свои извинения, если вопрос не по теме или слишком узкий.

  • @этоя-д8м
    @этоя-д8м 6 месяцев назад +1

    Я так понимаю malloc и free это аналог new и delete в с++?

    • @selfedu_rus
      @selfedu_rus  6 месяцев назад

      не совсем, new и delete дополнительно вызывают конструктор и деструктор класса

    • @этоя-д8м
      @этоя-д8м 6 месяцев назад

      @@selfedu_rus спасибо, буду разбираться

  • @Serdj_ohotnik
    @Serdj_ohotnik 9 месяцев назад +1

    А как же отчистить динамический массив ar, у тебя ж получается утечка памяти

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

      кажется я понял, realloc автоматически ее подчищает

    • @selfedu_rus
      @selfedu_rus  9 месяцев назад +1

      free(указатель);

  • @ШевченкоДаніілВікторович
    @ШевченкоДаніілВікторович 10 месяцев назад +1

    В этих функциях есть смысл при том, что существует new?

    • @selfedu_rus
      @selfedu_rus  10 месяцев назад

      В языке Си new не существует. Это оператор языка С++ и о нем дальше, когда будет переход к С++. Видите, как важно разделять эти два языка и учить их последовательно: сначала Си, а потом С++.

    • @ШевченкоДаніілВікторович
      @ШевченкоДаніілВікторович 10 месяцев назад

      @@selfedu_rus Я понимаю, что это части разных языков. Просто задумываюсь о том, актуально ли сейчас вообще ещё учить именно язык С, если в С++ всё работает намного стабильнее. Мой компилятор в Visual Studio уже много команд из Си даже не распознает или пишет "unsafe". Результаты работы malloc и calloc только в указатели типа void* давал записывать. Интересно услышать Ваше мнение

    • @ШевченкоДаніілВікторович
      @ШевченкоДаніілВікторович 10 месяцев назад

      @@selfedu_rus И ещё хотел спросить, есть ли у Вас на канале реализация бинарного дерева на С++. Потому что я только на Python нашел.

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

    в чём прикол calloc, если есть realloc?

  • @Петруха-у1л
    @Петруха-у1л Год назад +3

    Я хочу засунуть слово в переменную :ЕГГОГ
    Я хочу засунуть данные в переменную:ЕГГОГ
    Какой хмырь придумал эти типы данных и почему кислое нельзя превратить в длинное на ходу
    Какой извращенец подумал и сказал...ооо да мне нравится ставить точку с запятой после каждой строчки мм как удобно
    2д массив нельзя впихнуть в 3д массив
    Весь язык пропитан какими то заборами
    Так нельзя Так не делай Так я не могу
    Аж моча закипает когда я вижу этот синтаксис там больше слов чем самой сути кода ёлы палы

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

    Српчно курить мануалыюю Ошибка на ошибке

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

    Добрый день! Спасибо за урок! Переписал Вашу программу как у Вас было написано, но у меня проверка ругалась ( на size_t) и не хотела компилировать. После того как поменял на int и поставил фигурные скобки в строке 37 все заработало. Я новичок и просто интересно почему так у меня получилось? Проверял так: gcc -Wall -Werror -Wextra -o ucheba ucheba.c

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

      size_t - это переопределенный целочисленный тип (прописывается в одном из заголовочных файлов, вроде, stddef.h). Его определение выглядит примерно так:
      typedef unsigned int size_t;

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

      @@selfedu_rus ок. Спасибо большое за ответ!