calloc и malloc
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.09.03 13:25
Оценка:
А в чём разница? Такая вот принципиальная, что один другим в каких-то случаях не заменить или это проблематично?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: calloc и malloc
От: Kozyrevski  
Дата: 25.09.03 13:38
Оценка: 6 (1)
Здравствуйте, adontz, Вы писали:

A>А в чём разница? Такая вот принципиальная, что один другим в каких-то случаях не заменить или это проблематично?


Насколько я понимаю calloc выделяет память и инициализирует ее нулями, а malloc просто выделяет неинициализированную память.
Re: calloc и malloc
От: VCoder http://wxbar.sf.net
Дата: 25.09.03 13:40
Оценка:
Здравствуйте, adontz, Вы писали:

A>А в чём разница? Такая вот принципиальная, что один другим в каких-то случаях не заменить или это проблематично?

За C++ точно не скажу, но припоминаю, что в C основным отличием было то, что calloc выделенную память инициализирует нулями.
С уважением,
Дмитрий.
Re: calloc и malloc
От: Павел Кузнецов  
Дата: 25.09.03 13:52
Оценка:
Здравствуйте, adontz, Вы писали:

a> А в чём разница?


В том, что calloc принимает количество элементов (n) и размер (s), выделяет n * s (или чуть больше)
байт памяти (обычно через malloc) и обнуляет выделенную память. malloc просто выделяет память.

a> Такая вот принципиальная, что один другим в каких-то случаях не заменить или это проблематично?


calloc(n, s) с легкостью может быть заменен двумя последовательными вызовами malloc и memset.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: calloc и malloc
От: Vamp Россия  
Дата: 25.09.03 13:55
Оценка:
A>А в чём разница? Такая вот принципиальная, что один другим в каких-то случаях не заменить или это проблематично?
calloc инициализурет память нулями. То есть например, у нас есть структура:

struct S {
  int a; //must be ZERO!
  int b; //must be ZERO!
  int c; //must be ZERO!
  int d; //must be ZERO!
  int e; //Put value here!
};

S* ps;

Тогда
1)

ps=(S*)malloc(sizeof(S), 1);
ps->a=0;
ps->b=0;
ps->c=0;
ps->d=0;
ps->e=100;


или менее утомительно
ps=(S*)сalloc(sizeof(S), 1);
ps->e=100;
Да здравствует мыло душистое и веревка пушистая.
Re[2]: calloc и malloc
От: Павел Кузнецов  
Дата: 25.09.03 14:08
Оценка:
Здравствуйте, Vamp, Вы писали:

V> calloc инициализурет память нулями


Только важно учитывать, что это не то же, что обнуление элементов, т.к. битовая последовательность
из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: calloc и malloc
От: Аноним  
Дата: 25.09.03 14:39
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

V>> calloc инициализурет память нулями


ПК>Только важно учитывать, что это не то же, что обнуление элементов, т.к. битовая последовательность

ПК>из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.

Или просто 0.
Re[3]: calloc и malloc
От: Вадим Никулин Россия Здесь
Дата: 25.09.03 14:47
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, Vamp, Вы писали:


V>> calloc инициализурет память нулями


ПК>Только важно учитывать, что это не то же, что обнуление элементов, т.к. битовая последовательность

ПК>из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.

А можно пример такой платформы/компилятора?
Re[4]: calloc и malloc
От: Андрей Тарасевич Беларусь  
Дата: 25.09.03 16:48
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

V>>> calloc инициализурет память нулями


ПК>>Только важно учитывать, что это не то же, что обнуление элементов, т.к. битовая последовательность

ПК>>из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.

ВН>А можно пример такой платформы/компилятора?


А зачем пример-то?
Best regards,
Андрей Тарасевич
Re[4]: calloc и malloc
От: comer США http://getboost.codeplex.com/
Дата: 26.09.03 00:49
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ПК>>Только важно учитывать, что это не то же, что обнуление элементов, т.к. битовая последовательность

ПК>>из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.

ВН>А можно пример такой платформы/компилятора?


Практически любой, посмотри чему равно a0 и a1 в памяти:

struct A
{
    int a;
};

int main()
{
    int A::*a0 = &A::a;
    int A::*a1 = 0;
    return 0;
}
getboost.codeplex.com
citylizard.codeplex.com
Re[3]: calloc и malloc
От: Vamp Россия  
Дата: 26.09.03 06:22
Оценка:
ПК>из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.
Насчет последних понятно. Но любопытно, а как еще может быть представлен 0.0f , кроме как 0x00?
Да здравствует мыло душистое и веревка пушистая.
Re[5]: calloc и malloc
От: Аноним  
Дата: 26.09.03 09:21
Оценка:
ПК>>>Только важно учитывать, что это не то же, что обнуление элементов, т.к. битовая последовательность
ПК>>>из одних нулей далеко не обязательно соответствует, например, 0.0f, false или (void*)0.

ВН>>А можно пример такой платформы/компилятора?


АТ>А зачем пример-то?


Теоретикам примеры не нужны?
Re[6]: calloc и malloc
От: Павел Кузнецов  
Дата: 26.09.03 10:19
Оценка: 6 (1)
Здравствуйте, Вы писали:

ПК>>>> битовая последовательность из одних нулей далеко

ПК>>>> не обязательно соответствует, например, 0.0f, false или (void*)0.

ВН>>> А можно пример такой платформы/компилятора?


АТ>> А зачем пример-то?


> Теоретикам примеры не нужны?


Достаточно того, что стандарт не дает соответствующих гарантий относительно представления значений.
Вообще-то это более-менее стандартная рекомендация для написания переносимого кода...

http://www.psgd.org/paul/docs/cport/cport11.htm#misc

Примеров можно выдумать миллион не отходя от кассы. Начиная с классического неравенства представления
(void*)0 нулю (на физическом уровне) для диагностики обращений по нулевому указателю. То же может быть
верным и в отношении чисел с плавающей запятой: разработчики вполне могут взводить какие-нибудь битики
для run-time диагностики соответствия типов и т.п. Можно также рассмотреть интерпретаторы C++, в которых
даже представление int, вообще, может отличаться от "машинного" и т.п.

А "реальные" примеры... Их есть у меня

http://vision.eng.shu.ac.uk/C++/c/c-faq/cfaq5.html

5.17: Seriously, have any actual machines really used nonzero null pointers <...>?

A: The Prime 50 series used segment 07777, offset 0 for the null pointer, at least for PL/I. Later models
used segment 0, offset 0 for null pointers in C, necessitating new instructions such as TCNP (Test C Null
Pointer), evidently as a sop to all the extant poorly-written C code which made incorrect assumptions.

<...>

Some Honeywell-Bull mainframes use the bit pattern 06000 for (internal) null pointers.

The CDC Cyber 180 Series has 48-bit pointers consisting of a ring, segment, and offset. Most users
(in ring 11) have null pointers of 0xB00000000000. It was common on old CDC ones-complement machines to use
an all-one-bits word as a special flag for all kinds of data, including invalid addresses.

<...>

The Symbolics Lisp Machine, a tagged architecture, does not even have conventional numeric pointers;
it uses the pair (basically a nonexistent <object, offset> handle) as a C null pointer.

<...>

Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.