Machen Klammern einen Unterschied bei der Bestimmung der Größe eines Arrays?
Das folgende Programm gibt dieselbe Nummer zweimal auf gcc 4.8.2 aus:
#include <stdio.h>
int main()
{
char a[13];
printf("sizeof a is %zu\n", sizeof a );
printf("sizeof(a) is %zu\n", sizeof(a));
}
Gemäßdieser reddit Beitrag, gcc ist in dieser Hinsicht nicht standardkonform, da ein Ausdruck in Klammern nicht in der Liste der Ausnahmen enthalten ist, wenn kein Array-zu-Zeiger-Zerfall auftritt.
Ist dieser Kerl richtig? Hier ist das relevante Standardangebot:
Außer wenn es der Operand des @ isizeof
Operator oder der unäre&
-Operator oder ist ein Zeichenkettenliteral, das zum Initialisieren eines Arrays des Zeichentyps verwendet wird, oder ist ein breites Zeichenkettenliteral, das zum Initialisieren eines Arrays mit einem mit @ kompatiblen Elementtyp verwendet wirwchar_t
, ein Wert vom Typ 'Array vom Typ' wird in einen Ausdruck vom Typ 'Zeiger auf Typ' konvertiert, der auf das ursprüngliche Element des Array-Objekts zeigt und kein Wert ist.
Nur um klar zu sein, argumentiert er, dass(a)
sollte einen Array-zu-Zeiger-Zerfall auslösen, da Klammern in der obigen Liste nicht enthalten sind sizeof
operator, unary&
Operator, String-Literal als Initialisierer).