Все ли указатели получены из указателей на типы структур одинаково?

Вопрос

Вопрос о том, одинаковы ли все указатели, полученные из указателей на типы структур, нелегко ответить. Я считаю, что это важный вопрос по следующим двум основным причинам.

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:

Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращаемых значений функций и членов объединений.

Хотя стандарт не гласит: «Указатель на тип структуры» и были выбраны следующие слова: «Все указатели на типы структуры», в нем явно не указано, применяется ли он к рекурсивному выводу таких указателей. В других случаях, когда в стандарте упоминаются специальные свойства указателей, он не указывает явно или не упоминает рекурсивный вывод указателя, что означает, что применяется либо «вывод типа», либо нет, но это явно не упоминается.

И хотя используется выражение «Все указатели на» при обращении к типамтолько дважды, (для типов структуры и объединения), в отличие от более явной фразы: «Указатель на», который используется во всем стандарте, мы не можем сделать вывод, применимо ли это к рекурсивному выводу таких указателей.

Ответы на вопрос(2)

Ваш ответ на вопрос