Здесь есть два вопроса.
Во-первых, предупреждение о переполнении: 2900
и 1000000
имеют тип int
, поэтому результат их умножения также имеет тип int
. Результат не может быть представлен 32-разрядным целым числом со знаком, поэтому он переполняется. Вам нужно привести один (или оба) аргумента к size_t
, чтобы использовать арифметику без знака.
(Или вы можете переместить sizeof(char)
в качестве одного из первых двух слагаемых, поскольку его тип - size_t
, хотя вы также можете просто удалить sizeof(char)
, поскольку это всегда 1
.)
Во-вторых, максимальный размер, который может выделить malloc
, зависит как от платформы, на которой вы работаете, так и от текущего состояния программы. Если для удовлетворения запроса недостаточно непрерывного адресного пространства, очевидно, malloc
завершится неудачно.
Кроме того, платформа, на которой вы работаете, может иметь верхний предел того, насколько большой объект он может динамически размещать. Вам нужно будет обратиться к документации вашей платформы, чтобы узнать, каков этот верхний предел.
size_t
определенно не int
, потому что int
всегда подписано, а size_t
всегда без знака.