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

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

selfedu

1 год назад

17,329 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

Владимир Назарчук
Владимир Назарчук - 08.09.2023 13:34

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

Ответить
Yuliya Cher
Yuliya Cher - 07.09.2023 17:31

Роскошно.

Ответить
ivsh
ivsh - 30.08.2023 12:04

Вот эта штука выглядит плохо (и в левой и в правой части есть data) =>
data = append(data, &length, &capacity ...

Можно использовать указатель на указатель, в его значении хранить адрес массива, а в функцию передавать адрес этого указателя.

unsigned int dataPtr = (unsigned int)data;
for(char i=1; i<25; i++) {
append(&dataPtr, &length, &capacity,i);
}

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

Ответить
Михаил Елистратов
Михаил Елистратов - 09.08.2023 16:16

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

Ответить
Silver Lake
Silver Lake - 06.07.2023 23:20

My brain ram got overflow error.

Ответить
Гущин Андрей
Гущин Андрей - 17.06.2023 00:38

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

Ответить
Алекс Рутов
Алекс Рутов - 15.06.2023 04:44

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

Ответить
Андрей Саутенко
Андрей Саутенко - 14.06.2023 15:30

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

Ответить
DonLinoleum
DonLinoleum - 13.06.2023 20:45

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

Ответить
Иван Емельянов
Иван Емельянов - 13.06.2023 20:29

А раст будет?)

Ответить
Vladimir Astrelin
Vladimir Astrelin - 13.06.2023 20:01

Спасибо за науку. Хороший, толковый урок. Все как всегда на высшем уровне!

Ответить