¿El uso de memcmp en la matriz de int es estrictamente conforme?

¿Es el siguiente programa un programa estrictamente conforme en C? Estoy interesado en c90 y c99 pero las respuestas de c11 también son aceptables.

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

EnComentarios a mi respuesta en una pregunta diferente, Eric Postpischil insiste en que la salida del programa cambiará dependiendo de la plataforma, principalmente debido a la posibilidad de bits de relleno sin inicializar. Pensé que la asignación de estructura sobrescribiría todos los bits enb ser igual que ena. Pero, C99 no parece ofrecer tal garantía. De la Sección 6.5.16.1 p2:

Entarea simple (=), el valor del operando derecho se convierte al tipo de expresión de asignación y reemplaza el valor almacenado en el objeto designado por el operando izquierdo.

¿Qué se entiende por "convertido" y "reemplaza" en el contexto de los tipos compuestos?

Finalmente, considere el mismo programa, excepto que las definiciones dea yb se hacen globales. haríaese programa ser un programa estrictamente conforme?

Editar: Solo quería resumir parte del material de discusión aquí, y no agregar mi propia respuesta, ya que realmente no tengo una de mi propia creación.

El programa no es estrictamente conforme. Dado que la asignación es por valor y no por representación,b.array puede o no contener bits establecidos de manera diferente aa.array.a no necesita ser convertido ya que es del mismo tipo queb, pero el reemplazo es por valor, y hecho miembro por miembro.Incluso si las definiciones ena yb se hacen globales, post asignación,b.array puede o no contener bits establecidos de manera diferente aa.array. (Hubo poca discusión sobre los bytes de relleno enb, pero la pregunta publicada no fue sobre la comparación de la estructura. c99 carece de una mención de cómo se inicializa el relleno en el almacenamiento estático, pero c11 declara explícitamente que está inicializado en cero.)En una nota lateral, hay acuerdo en que elmemcmp está bien definido sib fue inicializado conmemcpy desdea.

Mi agradecimiento a todos los involucrados en la discusión.

Respuestas a la pregunta(2)

Su respuesta a la pregunta