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

preview_player
Показать описание


Функции для работы с памятью (кучей, heap): malloc(), free(), calloc(), realloc(), memcpy() и memmove(). Особенности и примеры.
Рекомендации по теме
Комментарии
Автор

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

vladimirastrelin
Автор

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

andrey_sautenko
Автор

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

MrLeyt
Автор

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

donlinoleum
Автор

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

AlexRootx
Автор

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

fxnzzxg
Автор

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

mihail
Автор

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

andredru
Автор

Вот эта штука выглядит плохо (и в левой и в правой части есть 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 нигде не менялся, а в значении по адресу лежал адрес массива и он по мере увеличения памяти будет меняться

userqhvey
Автор

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

bncfuwx
Автор

Спасибо большое за видео!
Мы можем выделять отдельно память с помощью realloc под каждый новый элемент массива? Я попробовал, получилось. Вводим элементы, пока не будет введено -1. Вот код:
#include <stdio.h>
#include <stdlib.h>

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;
}

olegafrikyan
Автор

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

mplqcuc
Автор

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

kkpwsqs
Автор

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

Serdj_ohotnik
Автор

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

nxnxury
Автор

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

Аж моча закипает когда я вижу этот синтаксис там больше слов чем самой сути кода ёлы палы

kvsdoqm
Автор

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

igorseledtsov
Автор

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

MElistratov