Подтвердить что ты не робот

Что происходит, когда мы называем Malloc отрицательным параметром?

7.22.3.4 Функция malloc Функция malloc выделяет пространство для объекта, размер которого задан по размеру и значение которого равно неопределенными.

Прототип: void *malloc(size_t size);

Я попытался передать отрицательное значение в качестве параметра: malloc(negative) возвращает NULL.

Это потому, что отрицательный параметр [size_t] преобразован в unsigned [некоторое большое значение] и не может выделить требуемое пространство или является параметром проверки функции и возвращает NULL?

Если его преобразование в большой положительный, то при вызове malloc(INT_MIN+2) он все равно возвращает NULL, но malloc(0) выделен для указателя и *p = somevalue работает. Как насчет этого?

Определена ли реализация?

Прочитайте эту ссылку: malloc (0)

4b9b3361

Ответ 1

Значение A size_t всегда положительно, даже если вы передадите отрицательное значение на malloc. Отрицательное значение преобразуется в значение без знака типа size_t, что приводит к огромному положительному значению.

Пример:

char *p = malloc(-2);

эквивалентно:

char *p = malloc(SIZE_MAX - 1);  // SIZE_MAX is the maximum
                                 // size_t value 

Ответ 2

Поскольку аргумент malloc имеет тип size_t, который является непознанным, но вы передаете целое число, которое подписано, целочисленное значение будет преобразовано в size_t, правила для этого будут описаны в стандартном разделе проекта C99 6.3.1.3 Целочисленные и беззнаковые целые числа, которые попадают под Conversions, и говорится:

В противном случае, если новый тип без знака, значение преобразуется путем многократного добавления или вычитая одно больше максимального значения, которое может быть представлено в новом типе пока значение не окажется в диапазоне нового типа .49)

Посмотрим на пример того, что это означает, если вы пройдете в -1, то будет добавлено значение max size_t + 1:

-1 + MAX_SIZE_T + 1

что приводит к:

 MAX_SIZE_T

Для -5 вы получите:

MAX_SIZE_T - 4

Это означает, что при малых отрицательных значениях полученное значение size_t будет очень большим положительным числом.

Итак, почему вы получаете NULL назад для malloc в этих случаях? Если мы вернемся к проекту стандартного раздела 7.20.3 Функции управления памятью, в нем говорится:

Если пространство не может быть выделено, нулевой указатель вернулся

Вы делаете слишком большой запрос и пространство не может быть выделено.