Стандарт C позволяет указать указатели на разные типы, имеющие разные размеры, например. sizeof(char*) != sizeof(int*)
разрешено. Однако он требует, чтобы, если указатель преобразуется в void*
и затем преобразован обратно в исходный тип, он должен сравниваться как равный его исходному значению. Поэтому логически следует, что sizeof(void*) >= sizeof(T*)
для всех типов T
, правильно?Существуют ли какие-либо платформы, где указатели на разные типы имеют разные размеры?
На большинстве распространенных сегодня платформ (x86, PPC, ARM и 64-битные варианты и т. Д.) Размер всех указателей равен размеру собственного регистра (4 или 8 байтов), независимо от того, печатать. Существуют ли какие-либо эзотерические или встроенные платформы, где указатели на разные типы могут иметь разные размеры? Я специально спрашиваю о данных указателей, хотя мне также будет интересно узнать, есть ли платформы, где функция указатели имеют необычные размеры.
Я определенно не, спрашивающий о указателях-указателях C++ и указателях-членах. Они занимают необычные размеры на общих платформах и могут даже варьироваться в пределах одной платформы, в зависимости от свойств класса-указателя (не полиморфного, одиночного наследования, множественного наследования, виртуального наследования или неполного типа).
Любопытно, какой раздел стандарта позволяет использовать разные размеры указателя? Не могли бы вы опубликовать этот раздел? – JaredPar
Nit-pick: «родной интегральный тип» в C должен быть int, что редко бывает 64-разрядным даже на 64-битных платформах AFAIK. Другими словами, LP64 более распространен, чем ILP64. – unwind
@ JaredPar: Я не совсем уверен, где это говорится в стандарте, но на этой странице http://www.lysator.liu.se/c/rat/d9.html#4-9-6-1 упоминается его в отношении спецификатора формата% p fprintf. @unwind: s/собственный целочисленный размер/собственный размер регистра/ –