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ę.