Это зависит от реализации.
uintmax_t
- это самый большой тип без знака, предоставляемый реализацией.size_t
- это тип результата оператора sizeof
, достаточно большой, чтобы вместить любой объект.unsigned int
- это, конечно, беззнаковая версия типа int
.
Единственные гарантии состоят в том, что size_t
и unsigned int
оба имеют по меньшей мере 16 бит (но, вероятно, будут больше),uintmax_t
составляет не менее 64 бит (при условии правил C99), а uintmax_t
по меньшей мере такой же ширины, как и любой другой тип без знака.
Предположительно file->size
- это размер в байтах файла, и онвероятно, типа uintmax_t
.В зависимости от системы максимальный размер файла может быть больше, чем размер любого возможного объекта в памяти.
Если размер этого конкретного файла не слишком велик, проблем нет.Но если size_t
равен 32 битам (подразумевается, что объекты не могут быть больше 4 гигабайт), а ваш файл, скажем, 5 гигабайт, то вы не сможете выделить буфер в памяти, достаточно большой для хранениясодержимое файла.
А максимальное значение size_t
, SIZE_MAX
- это только верхняя граница максимального размера объекта.То, что SIZE_MAX
равно 2 ** 31-1, не обязательно означает, что вы действительно можете создать такой большой объект.