Czy używanie memcmp na tablicy int ściśle odpowiada?

Czy następujący program jest programem ściśle zgodnym z C? Interesują mnie c90 i c99, ale odpowiedzi c11 są również dopuszczalne.

#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;
}

Wkomentarze do mojej odpowiedzi w innym pytaniu, Eric Postpischil upiera się, że wyjście programu zmieni się w zależności od platformy, głównie ze względu na możliwość niezainicjowanych bitów wypełniających. Myślałem, że przypisanie struktury nadpisze wszystkie bityb być taki sam jak wa. Ale wydaje się, że C99 nie daje takiej gwarancji. Z Sekcji 6.5.16.1 p2:

Wproste zadanie (=), wartość prawego argumentu jest konwertowana na typ wyrażenia przypisania i zastępuje wartość przechowywaną w obiekcie wskazanym przez lewy operand.

Co oznacza „konwertowany” i „zastępuje” w kontekście typów złożonych?

Na koniec rozważ ten sam program, z wyjątkiem definicjia ib są globalne. Byże program jest ściśle zgodny z programem?

Edytować: Chciałem tylko streścić niektóre z materiałów do dyskusji tutaj i nie dodawać własnej odpowiedzi, ponieważ tak naprawdę nie mam żadnej z moich własnych prac.

Program nie jest ściśle zgodny. Ponieważ przypisanie ma wartość, a nie reprezentację,b.array może lub nie może zawierać bitów ustawionych inaczej niża.array.a nie musi być konwertowany, ponieważ jest tego samego typu cob, ale zastąpienie jest wartościowe i wykonane przez członka.Nawet jeśli definicje wa ib są globalne, po przydzieleniu,b.array może lub nie może zawierać bitów ustawionych inaczej niża.array. (Niewiele dyskutowano na temat bajtów wypełniających wb, ale opublikowane pytanie nie dotyczyło porównania struktury. c99 nie ma wzmianki o tym, jak padding jest inicjowany w pamięci statycznej, ale c11 jawnie stwierdza, że ​​jest inicjowany zerowo.)Na marginesie, jest zgoda, żememcmp jest dobrze zdefiniowany, jeślib został zainicjowany za pomocąmemcpy za.

Dziękuję wszystkim zaangażowanym w dyskusję.

questionAnswers(2)

yourAnswerToTheQuestion