У меня вопрос касательно calloc и malloc: Они просто создают память по указателю(ну, например, там была какая-то память, а они взяли и сделали на том адресе ровно столько, сколько указано, даже если изначально там больше было) или они прибавляют alloc память к уже имеющейся по адресу?
Ну, как пример: у меня есть char *str; по адресу *str соответственно. Я её хочу заполнить в цикле while при помощи memcpy. пойдёт ли в цикле сalloc
Планирую что-то вроде
while() {
str = calloc(size);
memcpy(str,word,size);
free(word);
тут получаю это самое word;
}
C/C++
Как работает calloc в Си?
Обе просят у операционной системы выделить блок памяти в куче и возвращают указатель на его первый байт. Тип указателя 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);
}
char word[] = "Hello";
int size = strlen(word) + 1;
while(1) {
str = (char*)calloc(size, sizeof(char));
memcpy(str, word, size);
// тут получаете это самое str;
free(str);
}
Медер Карабаев
Спасибо за ответ!
Память не делается на том адресе. Система помнит, кто сколько и где у нее взял (работа с памятью одна из важнейших составляющих). И если "там было изначально больше" она ее просто не даст. Соответственно сама по себе ячейка памяти не хранит данных о том, является ли она чьей-то памятью. И система не дает память занятую другим приложением - иначе компьютер бы не работал.
Если malloc возвращает указатель, по которому в ячейках какое-то значение (мусор) - это значит что там просто не было уборщика. Но ячейка на момент выделения уже была ничейная.
realloc спрашивает у системы, есть ли возможность расширить уже взятую malloком память до большей величины. Если есть - то расширяет. У системы меняется запись о долге. malloc был должен 1000 байт с адреса 001000 по 001999 а теперь он должен 1500 байт с адреса 001000 по 002499. Самим же ячейкам памяти фиолетово кто ими владеет.
Если malloc возвращает указатель, по которому в ячейках какое-то значение (мусор) - это значит что там просто не было уборщика. Но ячейка на момент выделения уже была ничейная.
realloc спрашивает у системы, есть ли возможность расширить уже взятую malloком память до большей величины. Если есть - то расширяет. У системы меняется запись о долге. malloc был должен 1000 байт с адреса 001000 по 001999 а теперь он должен 1500 байт с адреса 001000 по 002499. Самим же ячейкам памяти фиолетово кто ими владеет.
Используй всегда malloc.
Это удобно, проверено и надёжно.
А calloc при маленьком стеке программы вылетает в аут.
Это удобно, проверено и надёжно.
А calloc при маленьком стеке программы вылетает в аут.
Похожие вопросы
- Код работает некорректно. Язык Си. Нахождение максимального отрицательного элемента матрицы и замена его числом.
- Как достать числа из бинарного файла и работать с ними? Си
- Почему Visual studio выдаёт ошибку работы с памятью, если она была выделена calloc-ом?
- Актуальность Си и Си++
- Изучение Си/Си++ дорожная карта?
- Возможно ли создание ЯП производительнее Си?
- Си!!! БЕЗ УКАЗАТЕЛЕЙ, ЯЗЫК СИ
- Решить задачу на языке СИ
- Программа на СИ. Циклы с постусловием и предусловием
- Написать код на языке си