Ответ 1
size_t определяется стандартом C как неподписанный тип возвращаемого значения оператора sizeof (C99 6.3.5.4.4) и аргумент malloc и друзей (C99 7.20.3.3 и т.д.). Фактический диапазон задается таким образом, что максимальный (SIZE_MAX) не менее 65535 (C99 7.18.3.2).
Однако это не позволяет нам определить sizeof (size_t). Реализация может свободно использовать любое представление, которое ему нравится для size_t, поэтому нет верхней границы по размеру, и реализация также может определять байт как 16 бит, и в этом случае size_t может быть эквивалентен unsigned char.
Тем не менее, если отложить это, в общем случае вы будете иметь 32-разрядные size_t для 32-разрядных программ и 64-разрядные в 64-битных программах, независимо от модели данных. Обычно модель данных влияет только на статические данные; например, в GCC:`-mcmodel=small'
Generate code for the small code model: the program and its
symbols must be linked in the lower 2 GB of the address space.
Pointers are 64 bits. Programs can be statically or dynamically
linked. This is the default code model.
`-mcmodel=kernel'
Generate code for the kernel code model. The kernel runs in the
negative 2 GB of the address space. This model has to be used for
Linux kernel code.
`-mcmodel=medium'
Generate code for the medium model: The program is linked in the
lower 2 GB of the address space but symbols can be located
anywhere in the address space. Programs can be statically or
dynamically linked, but building of shared libraries are not
supported with the medium model.
`-mcmodel=large'
Generate code for the large model: This model makes no assumptions
about addresses and sizes of sections.
Вы заметите, что указатели во всех случаях являются 64-битными; и в конце концов, мало смысла иметь 64-битные указатели, но не 64-битные.