Stimmt die Verwendung von memcmp für ein Array von int genau überein?

Ist das folgende Programm ein streng konformes Programm in C? Ich interessiere mich für c90 und c99, aber c11-Antworten sind auch akzeptabel.

#include <stdio.h>
#include <string.h>

struct S { int array[2]; };

int main () {
    struct S a = { { 1, 2 } };
    struct S b;
    b = a;
    if (memcmp(b.array, a.array, sizeof(b.array)) == 0) {
        puts("ok");
    }
    return 0;
}

ImKommentare zu meiner Antwort in einer anderen FrageEric Postpischil besteht darauf, dass sich die Programmausgabe je nach Plattform ändert, hauptsächlich aufgrund der Möglichkeit nicht initialisierter Füllbits. Ich dachte, die Strukturzuweisung würde alle Bits in überschreibenb dasselbe sein wie ina. Eine solche Garantie scheint C99 jedoch nicht zu bieten. Ab Abschnitt 6.5.16.1 p2:

Imeinfache Zuordnung (=) wird der Wert des rechten Operanden in den Typ des Zuweisungsausdrucks konvertiert und ersetzt den Wert, der in dem vom linken Operanden angegebenen Objekt gespeichert ist.

Was versteht man unter "konvertiert" und "ersetzt" im Zusammenhang mit zusammengesetzten Typen?

Betrachten Sie schließlich dasselbe Programm, mit der Ausnahme, dass die Definitionen vona undb werden global gemacht. WürdeDas Programm ein streng konformes Programm sein?

Bearbeiten: Ich wollte hier nur einen Teil des Diskussionsmaterials zusammenfassen und nicht meine eigene Antwort hinzufügen, da ich nicht wirklich eine meiner eigenen Kreationen habe.

Das Programm ist nicht konform. Da die Zuordnung nach Wert und nicht nach Darstellung erfolgt,b.array kann oder kann nicht Bits enthalten, die anders gesetzt sind alsa.array.a muss nicht konvertiert werden, da es sich um denselben Typ handelt wieb, aber die Ersetzung ist von Wert und erfolgt Mitglied für Mitglied.Auch wenn die Definitionen ina undb werden global gemacht, nach der Zuweisung,b.array kann oder kann nicht Bits enthalten, die anders gesetzt sind alsa.array. (Es gab wenig Diskussion über die Füllbytes inb, aber die gestellte Frage handelte nicht vom Strukturvergleich. c99 fehlt eine Erwähnung, wie das Auffüllen im statischen Speicher initialisiert wird, c11 gibt jedoch explizit an, dass es null ist.)Nebenbei besteht Einigkeit darüber, dass diememcmp ist gut definiert, wennb wurde mit initialisiertmemcpy vona.

Mein Dank geht an alle Beteiligten.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage