Модераторы: 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   Вверх
Samotnik
Дата 30.4.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


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

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



2 ressac
Ну да, а в чем собстно загвоздка?
PM MAIL   Вверх
ressac
Дата 1.5.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Samotnik, не в чём проехали, версии мозга разные smile

кстати хорошую вещь ты мне подсказал , спасиб smile smile 
Цитата

В случаи если p=0 , то  realloc работает как malloc!!!!

PM MAIL   Вверх
Samotnik
Дата 1.5.2007, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


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

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



Да вседа пожалуйста. Спрашивай еще!!!
Тока не забудь поставить галочку "Вопрос решен"  в конце  smile 
PM MAIL   Вверх
ressac
Дата 1.5.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Samotnik

да ещё не совсем решён мне вот интересно услышать ответ на этот вопрос


Цитата
Romikgy, 

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



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

тогда как обезопасить свой участок памяти чтоб его никто не смог прочитать?

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


Эксперт
****


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

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



Цитата(ressac @  1.5.2007,  11:13 Найти цитируемый пост)
значит если я тебя правильно понял указатель может бегать по любому участку памяти? а malloc и calloc делают то что выделяют участки памяти чтоб в будущем их никто не смог занять, естественно только до выполнения free()тогда как обезопасить свой участок памяти чтоб его никто не смог прочитать?

Смотри документацию к своей ОС
PM MAIL WWW   Вверх
Partizan
Дата 1.5.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



ressac, что значит "чтоб его никто не смог прочитать"????

никто эт кто? другой процесс? другой поток твоего процесса? функция которую выполняет твой процесс?



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Romikgy
Дата 1.5.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ressac @  1.5.2007,  09:13 Найти цитируемый пост)
может бегать по любому участку памяти

своего процесса имхо везде,
можно конечно и в чужой процесс залезть но там намного сложнее
Цитата(ressac @  1.5.2007,  09:13 Найти цитируемый пост)
а malloc и calloc делают то что выделяют участки памяти чтоб в будущем их никто не смог занять, естественно только до выполнения free()

выделение памяти не гарантирует что другой кусок проги не залезет в него своими данными (при ошибке или при не правильной разработке)
Цитата(ressac @  1.5.2007,  09:13 Найти цитируемый пост)
тогда как обезопасить свой участок памяти чтоб его никто не смог прочитать

имхо правильно писать проги,
а от доступа из других процессов, вообще отдельная тема разговора


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

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


Опытный
**


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

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



Partizan, я подразумевал другой процесс... 
PM MAIL   Вверх
Partizan
Дата 1.5.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



насколько мне известно функция ReadProcessMemory завершается неудачей в случае если память чужого процесса недоступна для чтения...по крайней мере так написано в MSDN, значит всё-таки её можно как-то оградить от чтения чужаками...

как это сделать, к сожалению подсказать не могу...самому было бы интересно узнать...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1173 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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