Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> calloc vs. malloc 
V
    Опции темы
ressac
Дата 30.4.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



в чём состоит разнится между calloc  и malloc
в инете нарыл что :

 calloc выделяет только в продолжительных участках памяти тойсть 0.1.2.3.4.5.... а malloc'y серовно где резервить память, плюс ещё calloc  заполняет массив нулями - какими нулями? обычными "0" или NULL ? что-то ещё интересно надо знать об этих двух функциях? я что-то пропустил? smile

 и на последок  функция realloc - это та которая добавляет элементы,  увеличивает массив. и вот мне интересно если массив я создал при помощи malloc то realloc будет увеличивать его по принципу malloc'a резервить память где попало или что? smile

всем спасибо за ответы...
PM MAIL   Вверх
Fazil6
Дата 30.4.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



обе эти функции выделяют непрерывные блоки памяти. По существу отличаются они параметрами

Это сообщение отредактировал(а) Fazil6 - 30.4.2007, 22:13
PM MAIL   Вверх
apook
Дата 30.4.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата

сли массив я создал при помощи malloc то realloc будет увеличивать его 

растянет или уменьшит если получится


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Romikgy
Дата 30.4.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Fazil6 @  30.4.2007,  21:12 Найти цитируемый пост)
обе эти функции выделяют непрерывные блоки памяти.


Цитата(ressac @  30.4.2007,  20:34 Найти цитируемый пост)
плюс ещё calloc  заполняет массив нулями - какими нулями

 smile 
Цитата(ressac @  30.4.2007,  20:34 Найти цитируемый пост)
обычными "0" или NULL ?

имхо в Си , что 0 , что NULL это одно и тоже

Цитата(ressac @  30.4.2007,  20:34 Найти цитируемый пост)
malloc

- это прото выделение памяти из хипа( с мусором который был до выделения)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ressac
Дата 30.4.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Цитата

- это прото выделение памяти из хипа( с мусором который был до выделения) 


не понял...
можно поподробней?


------------------------------------------------------------------------------------------------

попутно по теме

Код

#include <stdio.h>

main()
{

    int x,*p;

    p=malloc(sizeof(int)); // здесь я выделяю 1 блок типа int 
                             // тогда если это так то почему массив получается какой-то безграничный...
                             // тойсть я могу в него добавлять более чем один элемент
    for(x=0;x<10;x++)
    {

        scanf("%i",p+x);
        printf("\n %i - %i ",*(p+x),p+x);

    }

    free(p);

    puts("\n\n");
    system("pause");

}




PM MAIL   Вверх
Xenon
Дата 30.4.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



#define NULL 0
smile Одинаковые нули везде.
ressac, мусор - то есть неважно что там было до этого, если неочищенная память, то данные будут те, что остались


--------------------
user posted image  
PM MAIL   Вверх
Romikgy
Дата 30.4.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(ressac @  30.4.2007,  21:36 Найти цитируемый пост)
не понял...
можно поподробней?

хип это свободная память из которой динамически выделяется куски которые требуются те для работы
попробуй выделить малоком кусок памяти забить его данными (тебе известными ) и освободить этот блок, и сразуже выделить точно такой же
с вероятностью в 80-90 процентов данные в таком массиве даже не попортятся!
Цитата(ressac @  30.4.2007,  21:36 Найти цитируемый пост)
// здесь я выделяю 1 блок типа int 
                             // тогда если это так то почему массив получается какой-то безграничный...
                             // тойсть я могу в него добавлять более чем один элемент

дык за тем на что указывает твой указатель ты должен следить !!!! менеджер памяти здесь не причем!!!! в идеале указатель может быть приравнен к нулю и с помощью него можно будет обратится к ; гигам оперативки выделеной для воего процесса smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Daevaorn
Дата 30.4.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Xenon @  30.4.2007,  23:44 Найти цитируемый пост)
#define NULL 0 Одинаковые нули везде.

http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.null

PM MAIL WWW   Вверх
Любитель
Дата 30.4.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Насчёт нулей - как раз в плюсах это совсем ожно и тоже. В си - немножко нет. NULL имеет тип void*, а 0 - int. NULL дефайниться как: ((void*)0).


--------------------
PM MAIL ICQ Skype   Вверх
Samotnik
Дата 30.4.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



2 ressac 
Вобщем, если подвести итог сказанному выше,то:
malloc фция приним в качве аргумента ЧИСЛО байт, кот нужно выделить, и возвращает указатель на выделенную память. Пример
Код

P = malloc(sizeof(struct));

и освобождается
Код

free (p);


calloc, realloc Создают и модифицируют ДИНАМИЧЕСКИЕ МАССИВЫ. Фция calloс динамически выделяет память для массива. Она выглядит примерно так
Код

void *calloc (size_t n, size_t size)

Она принимает два аргумента: число элементов(n) , и размер каждого(size)

Фция realloc ИЗМЕНЯЕТ размер обьекта, выделенного в результате malloc, calloc, realloc
И самое основное, содержимое первоначального  обьекта сохраняется при условии, что размер новой выделенной памяти БОЛЬШЕ , чем первоначальный!!!!    Общий вид примерно такой
Код

void *realloc(void *p, size_t size)

где p- первоначальный обьект, size - новый размер!!!!!   
В случаи если p=0 , то  realloc работает как malloc!!!!
Вод и все !!!

Добавлено через 3 минуты и 41 секунду
А ваще используй new delete      И ни создавай себе не нужных лишних проблем!!!
PM MAIL   Вверх
ressac
Дата 30.4.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Daevaorn,
спасиб за ссылку.



Romikgy
значит если я тебя правильно понял указатель может бегать по любому участку памяти? а malloc и calloc делают то что выделяют участки памяти чтоб в будущем их никто не смог занять, естественно только до выполнения free()

Добавлено через 45 секунд
Samotnik,  спасиб, но разве массив это не тот-же указатель?

Добавлено через 1 минуту и 35 секунд
про new delete нам не рассказывали , они вроде только для с++ ? или нет?
PM MAIL   Вверх
Samotnik
Дата 30.4.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



2 ressac
Да конечно  new delete везде кроме с (С++, VisualC++, MFC, Java,......)
 А на сичет указателей правильней будет выразиться, что указателем на  блок памяти, созданным calloc  можно манипулировать как массивом.
Вод!!!
PM MAIL   Вверх
Xenon
Дата 30.4.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Daevaorn, да, эту статью я читал. Просто у меня Visual Studio даже подсвечивает это, как макрос. Видимо теперь это одно и тоже (теперь - С++)

Это сообщение отредактировал(а) Xenon - 30.4.2007, 23:28


--------------------
user posted image  
PM MAIL   Вверх
Любитель
Дата 30.4.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Xenon, ты программируешь на плюсах smile В плюсах это одно и то же, в си - нет. Смотри мой пост выше.

Впрочем в плюсах в скором времени будет специальное ключевое слово (nullptr, если не ошибаюсь, или типа того).


--------------------
PM MAIL ICQ Skype   Вверх
ressac
Дата 30.4.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Samotnik, ну когда я делаю при помощи malloc я тоже могу манипулировать как массивом.

Код

#include <stdio.h>

main()
{

    int x,*p;

    p=malloc(5*sizeof(int));

    for(x=0;x<5;x++)
    {

        scanf("%i",&p[x]);
        printf(" %i ",p[x]);

    }

    free(p);

    puts("\n\n");
    system("pause");

}


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1287 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.