Что происходит, когда мы называем 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)
Ответы
Ответ 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
Функции управления памятью, в нем говорится:
Если пространство не может быть выделено, нулевой указатель вернулся
Вы делаете слишком большой запрос и пространство не может быть выделено.