Está usando memcmp na matriz de int estritamente conforme?

O seguinte programa é um programa estritamente conforme em C? Estou interessado em c90 e c99, mas as respostas do c11 também são aceitáveis.

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

Emcomentários para a minha resposta em uma pergunta diferenteEric Postpischil insiste que a saída do programa irá mudar dependendo da plataforma, principalmente devido à possibilidade de bits de preenchimento não inicializados. Eu pensei que a atribuição de estrutura iria substituir todos os bits emb ser o mesmo que ema. Mas, C99 não parece oferecer tal garantia. Da seção 6.5.16.1 p2:

Ematribuição simples (=), o valor do operando direito é convertido para o tipo da expressão de atribuição e substitui o valor armazenado no objeto designado pelo operando esquerdo.

O que significa "convertido" e "substitui" no contexto de tipos compostos?

Finalmente, considere o mesmo programa, exceto que as definições dea eb são feitos globais. Serianaquela programa ser um programa estritamente conforme?

Editar: Só queria resumir um pouco do material de discussão aqui, e não adicionar minha própria resposta, já que eu realmente não tenho uma criação minha.

O programa não está estritamente em conformidade. Como a atribuição é por valor e não por representação,b.array pode ou não conter bits definidos diferentemente dea.array.a não precisa ser convertido, pois é do mesmo tipo queb, mas a substituição é por valor, e feito membro por membro.Mesmo que as definições ema eb são feitos globalmente, pós atribuição,b.array pode ou não conter bits definidos diferentemente dea.array. (Houve pouca discussão sobre os bytes de preenchimento emb, mas a questão postada não era sobre comparação de estrutura. c99 não menciona como o preenchimento é inicializado no armazenamento estático, mas c11 afirma explicitamente que ele foi inicializado zero.Em uma nota lateral, há concordância de que omemcmp está bem definido seb foi inicializado commemcpy dea.

Meus agradecimentos a todos os envolvidos na discussão.

questionAnswers(2)

yourAnswerToTheQuestion