Что такое код calloc


Отличия между функциями malloc, calloc и realloc и способами их использования

31.08.2020, 06:59

Выполнить функциями calloc() или malloc()
Написать пользовательскую функцию, решающую указанную ниже задачу. Массивы А и В динамические.

Вместо функции calloc() примените функцию malloc()
Пример 1. Написать программу заполнения матрицы размера n × m нечетными целыми числами с выводом.

realloc vs (malloc + memset)
На одном форуме мне сказали, что realloc работает чуть ли не в полтора раза медленнее связки malloc.

Динамический массив, malloc. realloc
Привет всем Пишу программу в С, нужно использовать динамический массив, одномерный, объявляю.

Динамический 2-размерный массив (malloc, realloc)
Здравствуйте, подскажите, пожалуйста, как мне решить вот эту задачу: Задание: Пользователь.

Эквивалентный код calloc

В данном фрагменте кода гр , что будет эквивалентный код для линии int *count = (int *)calloc(sizeof(int), 256); ?

Можно ли сделать это без использования calloc? Как мы можем объявить это с помощью таНос и нового в C ++?

Это позволит выделить 256 Интс, и значение инициализации массива для 0

Это делает то , что calloc делает в вашем коде.

calloc в основном эквивалентна malloc затем memset установить все данные до нуля байт:

C ++ предоставляет синтаксис , new что позволяет сделать это немного более просто:

Обратите внимание на скобки в конце. Также обратите внимание, однако, что вы вообще не хотите сделать это в C ++ вообще — вы обычно хотите , чтобы написать код что — то вроде этого:

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

Что такое код calloc

Самая актуальная документация по Visual Studio 2020: Документация по Visual Studio 2020.

Выделяет массив в памяти и инициализирует его элементы значением 0.

Параметры

num
Число элементов.

size
Длина каждого элемента в байтах.

calloc возвращает указатель на выделенную память. Пространство в хранилище, на которое указывает возвращаемое значение, гарантированно выровнено подходящим для хранения любого типа объектов образом. Чтобы получить указатель на тип, отличный от void , используйте приведение типов для возвращаемого значения.

Функция calloc выделяет пространство для хранения массива из num элементов, каждый из которых имеет размер size . Каждый элемент инициализируется значением 0.

calloc Задает errno для ENOMEM случае сбоя выделения памяти или количество запрошенной памяти превышает _HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделе errno _doserrno, _sys_errlist и _sys_nerr.

calloc вызовы malloc для использования функции C++ _set_new_mode функции, чтобы установить новый режим обработки. Новый режим обработки указывает, что в случае сбоя, malloc — вызвать новую подпрограмму обработчика, заданного методом _set_new_handler. По умолчанию malloc не вызывать новую подпрограмму обработчика не удалось выделить память. Можно переопределить это поведение по умолчанию, чтобы при calloc не удается выделить память, malloc вызывала новую подпрограмму обработчика таким же способом, что new делает оператор при сбое по той же причине. Чтобы переопределить значение по умолчанию, вызовите

ранних этапах программы или связи с NEWMODE. OBJ (см. параметры связи).

Когда приложение связано с отладочной версией библиотеки времени выполнения C, calloc равен _calloc_dbg. Дополнительные сведения об управлении кучи во время процесса отладки см. в разделе куча отладки CRT.

Функция calloc имеет метки __declspec(noalias) и __declspec(restrict) , что означает, что функция гарантированно не изменит глобальные переменные, а для возвращаемого указателя не будет создан псевдоним. Дополнительные сведения см. в разделе noalias и ограничить.

Подпрограмма Обязательный заголовок
calloc и

Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Разница между malloc и calloc? — c

В чем разница между выполнением:

Когда полезно использовать calloc над malloc или наоборот?


    8 19
  • 11 окт 2020 2020-10-11 01:51:44
  • user105033

19 ответов

malloc() принимает один аргумент, а calloc() — двоичный.

Во-вторых, malloc() не инициализирует выделенную память, а calloc() инициализирует выделенную память для ZERO. Оба malloc и calloc используются на языке C для динамического распределения памяти, они динамически получают блоки памяти.

  • 11 окт 2020 2020-10-11 01:51:48
  • Sanjay Kumaar

Нет блоков:
malloc() назначает один блок требуемой памяти,
calloc() Назначает несколько блоков запрошенной памяти

Инициализация:
malloc() не очищает и не инициализирует выделенную память.
calloc() инициализирует выделенную память нулем.

Скорость:
Скорость malloc() является быстрой.
calloc() скорость сравнительно медленная.

Синтекс:

Аргумент:
Если вы рассмотрите синтаксис malloc(), он будет принимать только 1 аргумент.
Если вы рассмотрите синтаксис calloc(), он будет принимать 2 аргумента.

Способ распределения памяти ::
Функция malloc() назначает память нужного «размера» из доступной кучи.
Функция calloc() назначает память, размер которой равен num * size.

Значение по имени:
Название malloc означает приписываемый распределению памяти.
Название calloc означает непрерывное распределение.

  • 11 окт 2020 2020-10-11 01:51:48
  • Majbah Habib

просто выделяет n bytes памяти без какой-либо инициализации (т.е. эти байты памяти будут содержать любые значения мусора).

Однако метод calloc() в c инициализирует значение 0 для всех байтов занятой памяти в дополнение к функции, которую выполняет malloc() .

Но кроме этого существует очень важное различие. При вызове malloc(x) он выделяет память (равную x блокам) и возвращает указатель на выделенный первый байт. Тем не менее, он не проверяет, выделено ли ровно х блоков памяти. Это приведет к случаю переполнения памяти. Однако calloc() проверяет размер выделения. Если это не удастся при распределении памяти или проверке выделенных байтов, она просто вернет значение null.

  • 11 окт 2020 2020-10-11 01:51:48
  • Rahul Raina

Основные отличия между malloc и calloc заключаются в следующем:

    malloc означает выделение памяти, тогда как calloc означает непрерывное выделение.


malloc принимает только один аргумент, размер блока, тогда как calloc принимает два аргумента, количество блоков, которые должны быть выделены, и размер каждого блока.

ptr = (cast-type *) malloc (размер байта)//malloc

ptr = (cast-type *) calloc (нет блоков, размер блока);//calloc

malloc не выполняет инициализацию памяти, и все адреса хранят значение мусора, тогда как calloc выполняет инициализацию памяти, а адреса инициализируются как значениями нуля или нулей.

  • 11 окт 2020 2020-10-11 01:51:48
  • Lov Verma

Имя malloc и calloc() — это функции библиотеки, которые динамически распределяют память.
Это означает, что память выделяется во время выполнения (выполнение программы) из сегмента кучи.

Инициализация: malloc() выделяет блок памяти заданного размера (в байтах) и возвращает указатель на начало блока.

Несколько аргументов: В отличие от malloc(), calloc() принимает два аргумента: 1) Количество блоков, которые нужно выделить. 2) Размер каждого блока.

Было бы лучше использовать malloc над calloc, если мы не хотим инициализации нуля, потому что malloc быстрее, чем calloc. Поэтому, если мы просто хотите скопировать некоторые вещи или сделать то, что не требует заполнение блоков нулями, то malloc будет лучше выбор.

  • 11 окт 2020 2020-10-11 01:51:47
  • jsroyal

malloc(): выделяет запрошенный размер байтов и возвращает указатель на первый байт выделенного пространства

calloc(): выделяет пространство для элементов массива, инициализирует ноль и затем возвращает указатель на память

  • 11 окт 2020 2020-10-11 01:51:47
  • suresh pareek

malloc() и calloc() — это функции из стандартной библиотеки C, которые позволяют распределять динамическую память, что означает, что они оба позволяют распределять память во время выполнения.

Их прототипы выглядят следующим образом:

В основном существуют два различия между ними:

Поведение: malloc() выделяет блок памяти, не инициализируя его, и чтение содержимого из этого блока приведет к значениям мусора. calloc() , с другой стороны, выделяет блок памяти и инициализирует его нулями, и, очевидно, чтение содержимого этого блока приведет к нулям.

Синтаксис: malloc() принимает 1 аргумент (размер, который нужно выделить), а calloc() принимает два аргумента (количество блоков, которые должны быть выделены, и размер каждого блока).

Возвращаемое значение из обоих значений является указателем на выделенный блок памяти, если это необходимо. В противном случае возвращается NULL с указанием отказа в распределении памяти.

Пример:

Такую же функциональность, как calloc() можно достичь с помощью malloc() и memset() :

Обратите внимание, что malloc() предпочтительно используется над calloc() поскольку он быстрее. Если нулевая инициализация значений требуется, используйте calloc() .

  • 11 окт 2020 2020-10-11 01:51:47

  • elmiomar

Разница пока не указана: ограничение размера

void *malloc(size_t size) может выделяться только до SIZE_MAX .

void *calloc(size_t nmemb, size_t size); может выделять около SIZE_MAX*SIZE_MAX .

Эта способность часто не используется во многих платформах с линейной адресацией. Такие системы ограничивают calloc() nmemb * size .

Рассмотрим тип 512 байтов, называемый disk_sector , и код хочет использовать множество секторов. Здесь код может использовать только до SIZE_MAX/sizeof disk_sector секторов.

Рассмотрим следующее, которое допускает еще большее распределение.

Теперь, если такая система может поставлять такое большое выделение, это другое дело. Сегодня больше не будет. Тем не менее, это происходило в течение многих лет, когда SIZE_MAX составлял 65535. Учитывая закон Мура, предположите, что это произойдет около 2030 года с некоторыми моделями памяти с SIZE_MAX == 4294967295 и пулы памяти в 100 GBytes.

  • 11 окт 2020 2020-10-11 01:51:47
  • chux

Функция calloc() , объявленная в заголовке , предлагает несколько преимуществ перед функцией malloc() .

  • Он выделяет память как количество элементов заданного размера, а
  • Инициализирует память, выделенную так, что все биты ноль.
  • 11 окт 2020 2020-10-11 01:51:47
  • Vipin Diwakar

Есть два отличия.
Во-первых, это число аргументов. malloc() принимает один аргумент (требуется память в байтах), а calloc() — два аргумента.
Во-вторых, malloc() не инициализирует выделенную память, а calloc() инициализирует выделенную память ZERO.

  • calloc() выделяет область памяти, длина будет продуктом ее параметров. calloc заполняет память с помощью ZERO и возвращает указатель на первый байт. Если ему не удается найти достаточное пространство, он возвращает указатель NULL .

Синтаксис: ptr_var=(cast_type *)calloc(no_of_blocks , size_of_each_block); т.е. ptr_var=(type *)calloc(n,s);

  • malloc() выделяет один блок памяти REQUSTED SIZE и возвращает указатель на первый байт. Если он не находит требуемый объем памяти, он возвращает нулевой указатель.

Синтаксис: ptr_var=(cast_type *)malloc(Size_in_bytes); Функция malloc() принимает один аргумент, который представляет собой количество байтов для распределения, тогда как функция calloc() принимает два аргумента, одна из которых является числом элементов, а другая — количеством байтов для распределения для каждого из этих элементов, Кроме того, calloc() инициализирует выделенное пространство нулями, а malloc() — нет.

  • 11 окт 2020 2020-10-11 01:51:46
  • Jainendra

malloc() обычно выделяет блок памяти, и это инициализированный сегмент памяти.

calloc() выделяет блок памяти и инициализирует весь блок памяти равным 0.


Если вы рассмотрите синтаксис malloc() , он будет принимать только 1 аргумент. Рассмотрим следующий пример ниже:

Пример: если вы хотите выделить 10 блоков памяти для типа int,

Если вы рассмотрите синтаксис calloc() , он будет принимать 2 аргумента. Рассмотрим следующий пример ниже:

Пример: если вы хотите выделить 10 блоков памяти для типа int и инициализировать все это в ZERO,

malloc() и calloc() по умолчанию возвращают void *, если они не приводятся по типу.!

  • 11 окт 2020 2020-10-11 01:51:46
  • Shivaraj Bhat

malloc() выделяет блок памяти заданного размера (в байтах) и возвращает указатель на начало блока.

malloc() не инициализирует выделенную память.

calloc() выделяет память, а также инициализирует выделение памяти для всех битов 0.

  • 11 окт 2020 2020-10-11 01:51:46
  • geetha

calloc обычно malloc+memset до 0

Обычно лучше использовать malloc+memset явно, особенно когда вы делаете что-то вроде:

Это лучше, потому что sizeof(Item) знает компилятор во время компиляции, и компилятор в большинстве случаев заменяет его наилучшими возможными инструкциями для нулевой памяти. С другой стороны, если memset происходит в calloc , размер параметра распределения не компилируется в коде calloc , и часто вызывается реальный memset , который обычно содержит код для байтов -byte заполнить до длинной границы, чем цикл, чтобы заполнить память в sizeof(long) кусках и, наконец, побайтовое заполнение оставшегося пространства. Даже если распределитель достаточно умен, чтобы вызвать некоторый aligned_memset , он все равно будет общим циклом.

Одним из примечательных исключений будет то, что вы делаете malloc/calloc из очень большой части памяти (несколько power_of_two килобайт), и в этом случае распределение может производиться непосредственно из ядра. Поскольку ядра ОС, как правило, обнуляют всю память, которую они выдают по соображениям безопасности, достаточно разумный calloc может просто вернуть его с дополнительным обнулением. Опять же — если вы просто выделяете то, что, как вы знаете, мало, вам может быть лучше с malloc + memset с точки зрения производительности.

  • 11 окт 2020 2020-10-11 01:51:46
  • virco

При распределении памяти с помощью calloc() объем запрошенной памяти не выделяется сразу. Вместо этого все страницы, принадлежащие блоку памяти, подключены к одной странице, содержащей все нули, с помощью некоторой MMU-магии (ссылки ниже). Если такие страницы только читаются (что верно для массивов b, c и d в исходной версии теста), данные предоставляются с единственной нулевой страницы, которая, конечно же, вписывается в кеш. Так много для ядер ядра, связанных с памятью. Если страница записывается (независимо от того, как), возникает ошибка, отображается «реальная» страница, а нулевая страница копируется в память. Это называется copy-on-write, хорошо известным подходом к оптимизации (который я даже много раз преподавал в своих лекциях на С++). После этого трюк с нулевым чтением больше не работает для этой страницы, и поэтому производительность была настолько ниже после вставки цикла предположительно избыточного цикла init.

  • 11 окт 2020 2020-10-11 01:51:46
  • Ashish Chavan

Нет разницы в размере выделенного блока памяти. calloc просто заполняет блок памяти физическим шаблоном всех нулевых битов. На практике часто предполагается, что объекты, расположенные в блоке памяти, выделенные с помощью calloc , имеют начальное значение, как если бы они были инициализированы литералом 0 , то есть целые числа должны иметь значение 0 , переменные с плавающей запятой — значение 0.0 , указатели — соответствующее значение нулевого указателя и т.д.

С педантичной точки зрения, однако, calloc (а также memset(. 0, . ) ) гарантируется только правильная инициализация (с нулями) объектов типа unsigned char . Все остальное не гарантируется надлежащим образом инициализированным и может содержать так называемое ловушечное представление, которое вызывает поведение undefined. Другими словами, для любого типа, отличного от unsigned char , вышеупомянутый all-zero-bits patterm может представлять недопустимое значение, ловушечное представление.

Позже, в одном из технических правил Corrigenda to C99, поведение было определено для всех целочисленных типов (что имеет смысл). То есть формально, на текущем языке C вы можете инициализировать только целые типы с помощью calloc (и memset(. 0, . ) ). Использование его для инициализации чего-либо еще в общем случае приводит к поведению undefined с точки зрения языка C.

На практике calloc работает, как мы все знаем:), но хотите ли вы его использовать (учитывая выше), зависит от вас. Я лично предпочитаю полностью избегать этого, вместо этого используйте malloc и выполните мою собственную инициализацию.


Наконец, еще одна важная деталь заключается в том, что calloc требуется для вычисления размера конечного блока внутри, путем умножения размера элемента на количество элементов. При этом calloc должен следить за возможным арифметическим переполнением. Это приведет к неудачному распределению (нулевой указатель), если запрошенный размер блока не может быть правильно рассчитан. Между тем, ваша версия malloc не пытается наблюдать за переполнением. Он будет выделять некоторый «непредсказуемый» объем памяти в случае переполнения.

Что такое код calloc

calloc — ● cde. ►LANGC Fonction permettant de réserver de la mémoire pour un processus, comme malloc. Avec calloc, on ne demande pas directement une quantité de mémoire mais n fois un bloc d une certaine taille. Qui plus est, tous les octets du bloc… … Dictionnaire d’informatique francophone

Jean-pierre calloc’h — Yann Ber Kalloc h (Jean Pierre Calloc h en français) est un écrivain breton de langue bretonne, et plus particulièrement du vannetais, né le 21 juillet 1888 à l île de Groix et tombé au champ d honneur le 10 avril 1917 à… … Wikipédia en Français

Jean-Pierre Calloc’h — Yann Ber Kalloc h (Jean Pierre Calloc h en français) est un écrivain breton de langue bretonne, et plus particulièrement du vannetais, né le 21 juillet 1888 à l île de Groix et tombé au champ d honneur le 10 avril 1917 à… … Wikipédia en Français

Jean-Pierre Calloc’h — Yann Ber Kalloc h (born Jean Pierre Calloc h in French) (21 July 1888 10 April 1917), French writer in Breton and FrenchHe was born on the island of Groix, the son of a humble fisher and he became an orphan in 1902. He studied in the Auray… … Wikipedia

Jean-Pierre Calloc’h — Yann Ber Kalloc h (Jean Pierre Calloc h en francés) fue un escritor en bretón nac >Wikipedia Español

Henri Calloc’h de Kérillis — Henri de Kérillis Henry de Kérillis Parlementaire français Naissance 27 octobre 1889 Décès … Wikipédia en Français

Malloc — (от англ. memory allocation, выделение памяти) и calloc (от англ. clear allocation, чистое выделение (памяти)) функции выделения динамической памяти, входящие в стандартную библиотеку языка Си. Содержание 1 Описание функций … Википедия

Yann-Ber Kalloc’h — Jean Pierre Calloc h Yann Ber Kalloc h (Jean Pierre Calloc h en français) est un écrivain breton de langue bretonne, et plus particulièrement du vannetais, né le 21 juillet 1888 à l île de Groix et tombé au champ d honneur le… … Wikipédia en Français

Malloc — In computing, malloc is a subroutine prov >Wikipedia

Malloc — est en informatique une fonction de la bibliothèque standard du C permettant d allouer dynamiquement de la mémoire. La libération de la mémoire ainsi réservée s effectue avec la fonction free. Cette fonction est déclarée dans le fichier d en tête … Wikipédia en Français

Использование стандартных функций malloc и free

Динамическое выделение памяти с помощью библиотечной функции malloc состоит из следующих шагов.

1. Включение в программу файла заголовков malloc.h директивой #include .

2. Объявление указателя нужного типа, например int *p;

3. Вызов функции malloc с указанием в качестве параметра требуемого количества памяти в байтах. Так как функция выдает результат своей работы в виде указателя на тип void, выполняется приведение типа (преобразуется тип результата к типу, указанному в объявлении). Присваивается полученное значение объявленному указателю. Пример:

p=(int *) malloc (число элементов массива*sizeof(int));

Вместо int может быть подставлен любой стандартный или введенный программистом тип.

4. Проверка факта выделения памяти. Если выделение памяти в нужном объеме невозможно, функция malloc возвращает в качестве своего результата нулевой указатель NULL, соответствующий значению ложь. Если выделение памяти выполнено, продолжаем выполнение программы, если нет, выходим из нее с соответствующей диагностикой о недостатке памяти. Пример:

if (!p) сообщение, выход; else продолжение;

5. Освобождение памяти после окончания работы с ней. Для этого вызываем функцию fгее и используем указатель в качестве аргумента:

Значение указателя, полученное после выполнения шага 3, должно сохраняться до выполнения шага 5. В противном случае вся память, выделенная по этому адресу, будет потеряна при выходе из программы, что, в конечном счете, может привести к недостатку памяти и нарушению работы операционной системы.

Наиболее частой причиной «зависания» компьютера при работе с динамически выделяемой памятью является несоответствие инструкций malloc и free (в обеих инструкциях должен использоваться один и тоже указатель) или недостаточный объем свободной памяти.

В качестве примера рассмотрим ввод/вывод одномерного динамического массива произвольной длины, задаваемой с клавиатуры.

int i,n,*massiv; //объявление указателя

cout >n;//ввод размера массива

massiv=(int*)malloc(n*sizeof(int)); //выделение динам.памяти

if(!massiv) //проверка факта выделения памяти

massiv[i]; //ввод массива

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студентов недели бывают четные, нечетные и зачетные. 9440 — | 7438 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Эквивалентный код для calloc

В данном фрагменте кода c будет эквивалентным кодом для строки int *count = (int *)calloc(sizeof(int), 256); ?

Можно ли это сделать без использования calloc? Как мы можем объявить это с помощью malloc и new в C++?

Создан 30 мар. 13 2013-03-30 21:01:51 nathan1138

Зачем вам использовать ‘malloc’ AND’ new’? Это альтернативные способы выделения памяти, вы не используете их вместе. – Ben Voigt 30 мар. 13 2013-03-30 21:08:22

@BenVoigt +1 и вы НЕ МОЖЕТЕ НЕ «освобождать» память, выделенную «новым»! – Morten Jensen 30 мар. 13 2013-03-30 21:13:01

Я знаю, что malloc и новые разные. Я хочу знать, как выделить этот кусок кода с помощью malloc, а также использовать новый. – nathan1138 30 мар. 13 2013-03-30 21:13:07

@ sbala_20 ‘new’ в принципе позволяет пропустить шаг’ sizeof’, поскольку размер выводится автоматически. Ответ Джерри Коффина показывает разницу между новыми и malloc. Читайте на ‘new’ и’ delete’, поскольку они добавляют дополнительный синтаксический сахар, например, для ‘delete []’ -ing массива :)Morten Jensen 30 мар. 13 2013-03-30 21:15:39

«Зачем вам использовать malloc AND new?» — Добро пожаловать на английский, Бен. Если, например, кто-то говорит, что они хотят знать, как писать двоичную процедуру поиска в Java и Perl, они не означают, что они хотят помещать утверждения с обоих языков в одну и ту же программу. – Jim Balter 30 мар. 13 2013-03-30 22:29:42

@ Jim: Я решил интерпретировать предложение таким образом, чтобы этот вопрос был разрешен здесь. Если вы хотите знать, как писать бинарный поиск на Java, а также как писать бинарный поиск в Perl, это два разных вопроса. – Ben Voigt 30 мар. 13 2013-03-30 22:47:06

@BenVoigt Ты смешной. Во всяком случае, ответ sbala_20 дает четкое представление о намерении, но я не думаю, что это два разных вопроса. – Jim Balter 30 мар. 13 2013-03-30 22:59:55

Просто короткая заметка о производительности: ‘calloc’ чрезвычайно быстро выделяет память, инициализированную нулем. Хотя «malloc + memset» функционально эквивалентен, он медленнее, чем calloc, и, кроме того, не имеет никакого реального стиля C++, но больше C-стиля. Однако ‘new int [3849731]();’ больше подходит для C++, но также значительно медленнее, чем calloc. Обратите внимание, что это имеет смысл только при распределении огромных блоков памяти! С небольшими массивами – math 26 фев. 16 2020-02-26 08:38:21

3 ответа

calloc в основном эквивалентен malloc с последующим memset , чтобы установить все данные на нулевые байты:

С ++ обеспечивает синтаксис new , что позволяет сделать это несколько проще:

Обратите внимание на паренс в конце. Также обратите внимание, однако, что вы обычно делаете не хотите сделать это в C++ вообще — вы обычно хотите, чтобы написать код что-то вроде этого:

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

Создан 30 мар. 13 2013-03-30 21:09:55 Jerry Coffin

Спасибо за ваш ответ! – nathan1138 30 мар. 13 2013-03-30 21:24:02

Функция calloc

Функция calloc() выделяет память, размер которой равен значению выражения num * size , т.е. память, достаточную для размещения массива, содержащего num объектов размером size . Все биты распределенной памяти инициализируются нулями.

Функция calloc() возвращает указатель на первый байт выделенной области памяти. Если для удовлетворения запроса нет достаточного объема памяти, возвращается нулевой указатель. Перед попыткой использовать распределенную память важно проверить, что возвращаемое значение не равно нулю.

Пример

Эта функция возвращает указатель на динамически распределенный блок памяти для массива из 100 чисел типа float :

calloc

Функция calloc() возвращает указатель на выделенную память. Размер выделенной памяти ра­вен величине num*size, где size задается в байтах. Это означает, что функция calloc() выделяет достаточно памяти для массива из num объектов каждый размером size байт.

Функция calloc() возвращает указатель на первый байт выделенной области. Если памяти недо­статочно для удовлетворения запроса, то возвращается нулевой указатель. Всегда важно прове­рять возвращаемое значение на его равенство NULL, прежде чем использовать этот указатель.

Эквивалентный код для calloc

В данном фрагменте кода c будет эквивалентным кодом для строки int *count = (int *)calloc(sizeof(int), 256); ?

Можно ли это сделать без использования calloc? Как мы можем объявить это с помощью malloc и new в C++?

Создан 30 мар. 13 2013-03-30 21:01:51 nathan1138

Зачем вам использовать ‘malloc’ AND’ new’? Это альтернативные способы выделения памяти, вы не используете их вместе. – Ben Voigt 30 мар. 13 2013-03-30 21:08:22

@BenVoigt +1 и вы НЕ МОЖЕТЕ НЕ «освобождать» память, выделенную «новым»! – Morten Jensen 30 мар. 13 2013-03-30 21:13:01

Я знаю, что malloc и новые разные. Я хочу знать, как выделить этот кусок кода с помощью malloc, а также использовать новый. – nathan1138 30 мар. 13 2013-03-30 21:13:07

@ sbala_20 ‘new’ в принципе позволяет пропустить шаг’ sizeof’, поскольку размер выводится автоматически. Ответ Джерри Коффина показывает разницу между новыми и malloc. Читайте на ‘new’ и’ delete’, поскольку они добавляют дополнительный синтаксический сахар, например, для ‘delete []’ -ing массива :)Morten Jensen 30 мар. 13 2013-03-30 21:15:39

«Зачем вам использовать malloc AND new?» — Добро пожаловать на английский, Бен. Если, например, кто-то говорит, что они хотят знать, как писать двоичную процедуру поиска в Java и Perl, они не означают, что они хотят помещать утверждения с обоих языков в одну и ту же программу. – Jim Balter 30 мар. 13 2013-03-30 22:29:42

@ Jim: Я решил интерпретировать предложение таким образом, чтобы этот вопрос был разрешен здесь. Если вы хотите знать, как писать бинарный поиск на Java, а также как писать бинарный поиск в Perl, это два разных вопроса. – Ben Voigt 30 мар. 13 2013-03-30 22:47:06

@BenVoigt Ты смешной. Во всяком случае, ответ sbala_20 дает четкое представление о намерении, но я не думаю, что это два разных вопроса. – Jim Balter 30 мар. 13 2013-03-30 22:59:55

Просто короткая заметка о производительности: ‘calloc’ чрезвычайно быстро выделяет память, инициализированную нулем. Хотя «malloc + memset» функционально эквивалентен, он медленнее, чем calloc, и, кроме того, не имеет никакого реального стиля C++, но больше C-стиля. Однако ‘new int [3849731]();’ больше подходит для C++, но также значительно медленнее, чем calloc. Обратите внимание, что это имеет смысл только при распределении огромных блоков памяти! С небольшими массивами – math 26 фев. 16 2020-02-26 08:38:21

3 ответа

calloc в основном эквивалентен malloc с последующим memset , чтобы установить все данные на нулевые байты:

С ++ обеспечивает синтаксис new , что позволяет сделать это несколько проще:

Обратите внимание на паренс в конце. Также обратите внимание, однако, что вы обычно делаете не хотите сделать это в C++ вообще — вы обычно хотите, чтобы написать код что-то вроде этого:

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

Создан 30 мар. 13 2013-03-30 21:09:55 Jerry Coffin

Спасибо за ваш ответ! – nathan1138 30 мар. 13 2013-03-30 21:24:02

Илон Маск рекомендует:  Что такое код imap_mail_compose
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL