какой смысл в malloc (0)? - PullRequest
       74

какой смысл в malloc (0)?

113 голосов
/ 07 января 2010

Только что увидел код:

artist = (char *) malloc(0);

и мне было интересно, зачем это делать?

Ответы [ 17 ]

0 голосов
/ 02 сентября 2015

Согласно Reed Copsey ответу и справочной странице по malloc, я написал несколько примеров для тестирования. И я обнаружил, что malloc (0) всегда будет давать ему уникальное значение. Смотрите мой пример:

char *ptr;
if( (ptr = (char *) malloc(0)) == NULL )
    puts("Got a null pointer");
else
    puts("Got a valid pointer");

Вывод будет «Получен верный указатель», что означает, что ptr не равно нулю.

0 голосов
/ 12 февраля 2015

В Windows:

  • void *p = malloc(0); выделит буфер нулевой длины в локальной куче. Возвращенный указатель является допустимым указателем кучи.
  • malloc в конечном итоге вызывает HeapAlloc, используя стандартную кучу времени выполнения C, которая затем вызывает RtlAllocateHeap и т. Д.
  • free(p); использует HeapFree для освобождения буфера длины 0 в куче. Не освобождение этого приведет к утечке памяти.
0 голосов
/ 07 января 2010

Не уверен, согласно некоторому случайному источнику malloc кода, который я обнаружил, ввод 0 приводит к возвращаемому значению NULL. Так что это безумный способ установить указатель художника на NULL.

http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html

0 голосов
/ 01 января 2014

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

int *i = malloc(0);
*i = 100;
printf("%d", *i);

Мы ожидаем ошибки сегментации здесь, но удивительно, что это печатает 100! Это потому, что malloc фактически запрашивает огромный кусок памяти, когда мы вызываем malloc впервые. Каждый последующий вызов malloc использует память из этого большого блока. Только после того, как этот огромный кусок закончен, запрашивается новая память.

Использование malloc (0): если вы хотите, чтобы последующие вызовы malloc были более быстрыми, вызов malloc (0) должен сделать это за вас (за исключением крайних случаев).

0 голосов
/ 13 июля 2017

Вот анализ после запуска с помощью инструмента проверки памяти valgrind.

==16740== Command: ./malloc0
==16740==
p1 = 0x5204040
==16740==
==16740== HEAP SUMMARY:
==16740==     in use at exit: 0 bytes in 0 blocks
==16740==   total heap usage: 2 allocs, 2 frees, 1,024 bytes allocated
==16740==
==16740== All heap blocks were freed -- no leaks are possible

и вот мой пример кода:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
   //int i;
   char *p1;

   p1 = (char *)malloc(0);
   printf("p1 = %p\n", p1);

   free(p1);

   return 0;

}

По умолчанию выделяется 1024 байта. Если я увеличу размер malloc, выделенные байты увеличатся на 1025 и так далее.

0 голосов
/ 11 мая 2019

Это на самом деле весьма полезно, и (очевидно ИМХО) допустимое поведение возврата указателя NULL нарушено. Динамический указатель полезен не только для того, на что он указывает, но также и потому, что его адрес уникален. Возвращение NULL удаляет это второе свойство. Все встроенные malloc, которые я программирую (довольно часто на самом деле), имеют такое поведение.

0 голосов
/ 15 января 2014

malloc(0) вернет действительный адрес памяти, диапазон которого будет зависеть от типа указателя, которому выделяется память. Также вы можете присвоить значения области памяти, но это должно быть в диапазоне с типом используемого указателя. Вы также можете освободить выделенную память. Я объясню это на примере:

int *p=NULL;
p=(int *)malloc(0);
free(p);

Приведенный выше код будет хорошо работать в компиляторе gcc на компьютере с Linux. Если у вас 32-битный компилятор, вы можете указать значения в целочисленном диапазоне, то есть от -2147483648 до 2147483647. То же самое относится и к символам. Обратите внимание, что если тип объявленного указателя изменяется, диапазон значений будет меняться независимо от malloc typecast, т.е.

unsigned char *p=NULL;
p =(char *)malloc(0);
free(p);

p примет значение от 0 до 255 символа, поскольку оно объявлено как беззнаковое целое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...