LINUX.ORG.RU

malloc() глюк ?


0

0

gcc 2.95.2,
libc.so.6 версии 2.1.3
malloc(0) возвращает НЕ NULL!!
В описании, доступном из Линукса (SuSE 7.0), и не написано,
что он должен NULL возвращать, а в манах Tru64 UNIX со ссылкой на
стандарты (там куча) сказано, что он должен NULL вернуть (и действит.
возвращает). Не охота копать, может, кто знает?
1. Как у народа ведет себя malloc(0)?
2. Что говорят стандарты?

anonymous

Да, еще прикол -- malloc(0) действительно распределяет 0 байт памяти!
Файл tryrealloc.c:
#include <stdlib.h>
#include <stdio.h>
#include <mcheck.h>

int main (void)
{
int *ptr=NULL;
mtrace();
ptr=malloc(0);
printf("ono=%p\n",ptr);
return 0;
}

Делаем:
gcc -g tryrealloc.c
export MALLOC_TRACE=ttt; ./a.out
mtrace ./a.out ttt

Memory not freed:
-----------------
Address Size Caller
0x080496e8 0 at /home/vasya/tmp/tryrealloc.c:9

anonymous
()

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

justme
()

Дословно из описания ф-ции (info libc): If no more space is available, `malloc' returns a null pointer. Отсюда следует, что NULL возвращается только в случае ошибки выделения памяти. Поскольку при вызове malloc(0) память выделяется (т.е. ошибки при выделении не возникло), то возвращается указатель на выделенную память (а он != NULL).

Druker
()

V dannom sluchae vse pravil'no malloc(0) - rabotaet, i vydeljaet pamjat':)) Esli nado chby na 0 byla oshybka mogno sdelat' realloc(ptr, size) :))) Delo v tom chto esli ptr do etogo ne raspredeljalsja (ptr = NULL) to eto budet = malloc. Esli size = 0 to eto vse ravno chto free i v etom sluchae NULL vozvraschaetsj.

tvn
()
Ответ на: комментарий от tvn

tvn (*) (2001-09-25 11:29:30.0):
> Delo v tom chto esli ptr do etogo ne raspredeljalsja (ptr = NULL) to
> eto budet = malloc. Esli size = 0 to eto vse ravno chto free i v etom
> sluchae NULL vozvraschaetsj.
Собственно, грабли и подползли на reallocе. Я заложился на то,
что realloc(NULL,0) вернет мне NULL (это мне и надо было), а он сработал
как malloc(0) (а вовсе не как free()) как было описано.

А вот выдержка из мана с OSF1:
If the size parameter is 0 (zero), the malloc() function returns a null pointer.

Может, кто может привести ссылку на официальные стандарты?

anonymous
()

Насколько мне известно в POSIX'е malloc(0) вернет адрес.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.