Sind alle von Zeigern auf Strukturtypen abgeleiteten Zeiger gleich?

Die Frage

Die Frage, ob alle von Zeigern abgeleiteten Zeiger auf Strukturtypen gleich sind, ist nicht einfach zu beantworten. Ich halte es aus den folgenden beiden Hauptgründen für eine wichtige Frage.

EIN. Das Fehlen eines Zeigers auf einen Zeiger auf 'irgendeinen' unvollständigen oder Objekttyp schränkt die praktischen Funktionsschnittstellen ein, wie zum Beispiel:

int allocate(ANY_TYPE  **p,
             size_t    s);

int main(void)
{
    int *p;
    int r = allocate(&p, sizeof *p);
}

[Komplettes Codebeispiel]

Der vorhandene Zeiger auf einen unvollständigen oder Objekttyp wird explizit wie folgt beschrieben:

C99 / C11 §6.3.2.3 p1:

Ein Zeiger auf ungültig kann in einen oder von einem Zeiger auf einen unvollständigen oder Objekttyp konvertiert werden. [...]

Ein Zeiger, der aus dem vorhandenen Zeiger auf einen unvollständigen oder Objekttyp, Zeiger auf einen ungültigen Zeiger, abgeleitet wird, ist streng genommen ein Zeiger auf einen ungültigen Zeiger und muss nicht mit einem Zeiger konvertierbar sein, der von einem Zeiger auf einen unvollständigen Zeiger abgeleitet wird oder Objekttyp.


B. Es ist nicht ungewöhnlich, dass Programmierer Konventionen verwenden, die auf nicht erforderlichen Annahmen beruhen, die sich auf die Verallgemeinerung von Zeigern beziehen, wissentlich oder unwissentlich, je nach ihrer Erfahrung mit ihren spezifischen Implementierungen. Annahmen wie Konvertierbarkeit, Repräsentierbarkeit als Ganzzahl oder gemeinsame Nutzung einer Eigenschaft: Objektgröße, Repräsentation oder Ausrichtung.

Die Worte der Norm

GemäßC99 §6.2.5 p27 / C11 §6.2.5 p28:

[...] Alle Zeiger auf Strukturtypen müssen die gleichen Darstellungs- und Ausrichtungsanforderungen haben. [...]

gefolgt vonC99 TC3 Footnote 39 / C11 Footnote 48:

Dieselben Darstellungs- und Ausrichtungsanforderungen implizieren die Austauschbarkeit von Argumenten für Funktionen, Rückgabewerte von Funktionen und Gewerkschaftsmitgliedern.

Obwohl die Norm nicht sagt: "Ein Zeiger auf einen Strukturtyp" und die folgenden Wörter ausgewählt wurden: "Alle Zeiger auf Strukturtypen", gibt sie nicht explizit an, ob sie für eine rekursive Ableitung solcher Zeiger gilt. In anderen Fällen, in denen spezielle Eigenschaften von Zeigern im Standard erwähnt werden, wird die rekursive Zeigerableitung nicht explizit angegeben oder erwähnt, was bedeutet, dass entweder die 'Typableitung' angewendet wird oder nicht - aber nicht explizit erwähnt wird.

Und obwohl die Formulierung "Alle Zeiger auf" verwendet wird, während auf Typen verwiesen wirdnur zweimal(für Struktur- und Vereinigungstypen) Im Gegensatz zu der expliziteren Formulierung: "Ein Zeiger auf", die in der Norm verwendet wird, können wir nicht schließen, ob dies für eine rekursive Ableitung solcher Zeiger gilt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage