2016-06-02 21 views
4

Lässt die folgenden in C oder C99 annehmen:ein Array von Strukturen in C oder C99 initialisieren, um alle die gleichen Werte

typedef struct 
{ 
    int x; 
    double y; 
} MY_S; 

MY_S a[666] = {333, 666.6}; 

Ist dies nur das erste Objekt des Arrays initialisieren? Wenn ja, gibt es eine Möglichkeit, ALLE Elemente des Arrays unter Verwendung dieser Syntax auf alle die gleichen Werte zu initialisieren (ohne eine Funktion/Schleife aufzurufen und ohne den Initialisierer zu wiederholen)?

+0

Ja, das erste Element nur, der Rest wird mit '0' gefüllt. –

+0

Wenn Sie nach einer standardkonformen Methode suchen, nein, gibt es keine. Wenn Sie GCC verwenden und mit implementierungsdefinierten Lösungen zufrieden sind: http://StackOverflow.com/a/207702/3470630 – TezlaCoil

+0

Was ist falsch bei einem einzeiligen Anruf bei memset? – michaelsnowden

Antwort

1

Zitat von C99 standard Abschnitt 6.7.8:

Wenn weniger Initialisierer in einer geschweiften Klammern stehenden Liste sind als es Elemente oder Elemente eines Aggregats sind, oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays mit bekannter Größe verwendet wird, als es Elemente im Array gibt. Der Rest des Aggregats muss implizit initialisiert sein e als Objekte mit statischer Speicherdauer.

I.e. Nur das erste Element wird auf den gelieferten Wert initialisiert, während die anderen mit Nullen gefüllt werden.

Es gibt keine Möglichkeit (in Standard C) außer einer Schleife ein Array komplexer Strukturen zu initialisieren (memset() kann verwendet werden, um einen Speicherblock mit einem angegebenen Wert zu initialisieren).

2

Dies initialisiert die erste Struktur, und alles andere wird auf Null gesetzt.

Siehe ANSI C89 3.5.7 Initialisierung:

[...]

Schwimmers z [4] [3] = {{1}, {2}, {3}, { 4}};

initialisiert die erste Spalte von z wie angegeben und initialisiert den Rest mit Nullen.

[...]

Es gibt leider keine Möglichkeit, das Array ohne zu Schleifen über sie zu initialisieren, memset oder durch andere Mittel fordern.

0

Ich weiß nicht wirklich C, aber ich kann mir vorstellen, dass Sie alle durchlaufen und initialisieren könnten?

so:

MY_S* s = malloc(666 * sizeof *MY_S); 
for (i = 0; i < 666; i++) 
{ 
    s[i].x = 333; /* or malloc and strcpy */ 
    s[i].y = 666.6; /* or malloc and strcpy */ 
} 
+1

OP weiß das. * "ohne Aufruf einer Funktion/Schleife" *. –

+1

oh, na dann ist die kurze Antwort, nein. @WeatherVane und vergib mir, ich habe meinen Fehler bearbeitet – Hidden

+0

Ich habe keine Ahnung, worüber du gerade stehst: D haha ​​nur ein weiterer dummer Fehler von mir @chux – Hidden

2

Wenn ich Sie richtig verstanden, Sie müssen an bestimmten initializers designated initializers

Dies ist eine GNU C-Erweiterung einen Blick nehmen, mit denen Sie Werte eines Arrays in einer Show initialisieren.

Dies initialisiert 1 zu den Elementen 0 bis 9, 2 zu den Elementen 10 bis 99, 3 zu 100 Element.

Und in Ihrem Fall ist es wie

MY_S a[666] = { [0 .. 665] = {333, 666.0} }; 
+0

Was für ein Pech das ist Teil des Standards :( – Silicomancer

2

In Standard-C, können Sie die Initialisierung wiederholen müssen. In GCC können Sie festlegen, mit dem gleichen initializer, wie dies eine Reihe von Elementen zu initialisieren:

MY_S a[666] = { [0 .. 665] = {333, 666.0} };