C/C++

Как работает calloc в Си?

У меня вопрос касательно calloc и malloc: Они просто создают память по указателю(ну, например, там была какая-то память, а они взяли и сделали на том адресе ровно столько, сколько указано, даже если изначально там больше было) или они прибавляют alloc память к уже имеющейся по адресу?
Ну, как пример: у меня есть char *str; по адресу *str соответственно. Я её хочу заполнить в цикле while при помощи memcpy. пойдёт ли в цикле сalloc
Планирую что-то вроде
while() {
str = calloc(size);
memcpy(str,word,size);
free(word);
тут получаю это самое word;
}
Обе просят у операционной системы выделить блок памяти в куче и возвращают указатель на его первый байт. Тип указателя void. В отличии от malloc, calloc инициализирует выделенную память нулями.

char word[] = "Hello";
int size = strlen(word) + 1;
while(1) {
str = (char*)calloc(size, sizeof(char));
memcpy(str, word, size);
// тут получаете это самое str;
free(str);
}
Cergei Medvedev
Cergei Medvedev
65 261
Лучший ответ
Медер Карабаев Спасибо за ответ!
Память не делается на том адресе. Система помнит, кто сколько и где у нее взял (работа с памятью одна из важнейших составляющих). И если "там было изначально больше" она ее просто не даст. Соответственно сама по себе ячейка памяти не хранит данных о том, является ли она чьей-то памятью. И система не дает память занятую другим приложением - иначе компьютер бы не работал.
Если malloc возвращает указатель, по которому в ячейках какое-то значение (мусор) - это значит что там просто не было уборщика. Но ячейка на момент выделения уже была ничейная.
realloc спрашивает у системы, есть ли возможность расширить уже взятую malloком память до большей величины. Если есть - то расширяет. У системы меняется запись о долге. malloc был должен 1000 байт с адреса 001000 по 001999 а теперь он должен 1500 байт с адреса 001000 по 002499. Самим же ячейкам памяти фиолетово кто ими владеет.
Используй всегда malloc.
Это удобно, проверено и надёжно.

А calloc при маленьком стеке программы вылетает в аут.