Все ли указатели получены из указателей на типы структур одинаково?
Вопрос о том, одинаковы ли все указатели, полученные из указателей на типы структур, нелегко ответить. Я считаю, что это важный вопрос по следующим двум основным причинам.
A. Отсутствие указателя на указатель на «любой» неполный объект или тип объекта накладывает ограничение на удобные интерфейсы функций, такие как:
int allocate(ANY_TYPE **p,
size_t s);
int main(void)
{
int *p;
int r = allocate(&p, sizeof *p);
}
Существующий указатель на «любой» неполный или тип объекта явно описывается как:
C99
/ C11
§6.3.2.3 p1
:
Указатель на void может быть преобразован в или из указателя на любой неполный или тип объекта. [...]
Указатель, полученный из существующего указателя на «любой» неполный или тип объекта, указатель на указатель на void, является строго указателем на указатель на void и не обязательно должен быть конвертируемым с указателем, полученным из указателя на «любой» неполный или тип объекта.
B. Программисты нередко используют соглашения, основанные на предположениях, которые не требуются, связанные с обобщением указателей, сознательно или неосознанно, в то же время в зависимости от их опыта с их конкретными реализациями. Предположения, такие как возможность преобразования, представление в виде целых чисел или совместное использование общего свойства: размера объекта, представления или выравнивания.
В соответствии сC99 §6.2.5 p27
/ C11 §6.2.5 p28
:
[...] Все указатели на типы конструкций должны иметь те же требования к представлению и выравниванию, что и другие. [...]
С последующимC99 TC3 Footnote 39
/ C11 Footnote 48
:
Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращаемых значений функций и членов объединений.
Хотя стандарт не гласит: «Указатель на тип структуры» и были выбраны следующие слова: «Все указатели на типы структуры», в нем явно не указано, применяется ли он к рекурсивному выводу таких указателей. В других случаях, когда в стандарте упоминаются специальные свойства указателей, он не указывает явно или не упоминает рекурсивный вывод указателя, что означает, что применяется либо «вывод типа», либо нет, но это явно не упоминается.
И хотя используется выражение «Все указатели на» при обращении к типамтолько дважды, (для типов структуры и объединения), в отличие от более явной фразы: «Указатель на», который используется во всем стандарте, мы не можем сделать вывод, применимо ли это к рекурсивному выводу таких указателей.