PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Array Initalisierung


Gast
2008-04-14, 15:24:34
Ist es eigentlich von Vort- oder Nachteil einen C-Array (con char arrays) so:
char* test[] = { "erster", "zweiter", "dritter" };
oder so
char* test[3];
test[0] = "erster";
test[1] = "zweiter";
test[3] = "dritter"; zu erstellen?

Ersteres ist schön, aber ist es auch irgendwie schneller? Oder steht im Programmcode am Ende exakt dasselbe?

danke

Coda
2008-04-14, 15:32:57
Dürfte exakt dasselbe sein.

Ectoplasma
2008-04-14, 15:47:29
Es ist egal. Aber eine kleine Anmerkung.

Der vector sollte als const Vector deklariert werden, weil der Text darin const ist.


const char* test[] = { "erster", "zweiter", "dritter" };


Unter GCC 4 erhält man sonst eine deprecated Warnung.


test.cpp: In function 'int main(int, char**)':
test.cpp:6: warning: deprecated conversion from string constant to 'char*'

PHuV
2008-04-14, 17:22:59
Ist es eigentlich von Vort- oder Nachteil einen C-Array (con char arrays) so:
char* test[] = { "erster", "zweiter", "dritter" };
oder so
char* test[3];
test[0] = "erster";
test[1] = "zweiter";
test[3] = "dritter"; zu erstellen?

Ersteres ist schön, aber ist es auch irgendwie schneller? Oder steht im Programmcode am Ende exakt dasselbe?

danke

Intern dürfte compiler ziemlich das selbe erstellen. Wenn diese Werte Konstanten sind, dann kannst Du es so verwenden. Wenn Du jedoch die Werte veränderst, unbedingt die Zeiger entsprechend dynamisch oder statisch allozieren, sonst hast Du im Code schnell Spaß, wenn Speicherbereicht überschrieben werden.

Es ist egal. Aber eine kleine Anmerkung.
Der vector sollte als const Vector deklariert werden, weil der Text darin const ist.


Das ist C++-Käse, in C (und davon ist doch hier die Rede) gibt es so was nicht.

Ectoplasma
2008-04-14, 17:43:41
Das ist C++-Käse, in C (und davon ist doch hier die Rede) gibt es so was nicht.

Genau, immer feste drauf ohne zu wissen worum es geht :rolleyes:.
Das Problem in C ist genau das gleiche. Mit C++ alleine hat das gar nichts zu tun. Der C Compiler gibt nur keine Warnung aus.

Xmas
2008-04-14, 19:23:26
test[1] = "zweiter";
test[3] = "dritter";
Ersteres hat vor allem den Vorteil, dass du dir solche Bugs ersparst.

PHuV
2008-04-14, 21:15:54
Genau, immer feste drauf ohne zu wissen worum es geht :rolleyes:.
Das Problem in C ist genau das gleiche. Mit C++ alleine hat das gar nichts zu tun. Der C Compiler gibt nur keine Warnung aus.

Nochmals, es geht um C, und in C gibt es const Vector nicht, es ist nicht im Ansi Standard enthalten. Es gibt lediglich das Schlüsselwort const.

Kannst ja gerne mal nachlesen:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

RattuS
2008-04-14, 22:56:48
Die Strings kommen so oder so in den Stack bzw. Heap (bei größeren Arrays). Demnach ist das eine reine Interpretationssache des Compilers.

Gast
2008-04-15, 07:37:22
danke

Superguppy
2008-04-15, 22:18:34
Die Strings kommen so oder so in den Stack bzw. Heap (bei größeren Arrays).
Ich behaupte zwar, dass ein statisches Array immer am Stack landet und Heapspeicher mit malloc() angefordert werden muss ... aber ich lass mich gerne berichtigen, falls das nicht so ganz stimmt.

Xmas
2008-04-15, 22:39:13
Die Strings kommen so oder so in den Stack bzw. Heap (bei größeren Arrays). Demnach ist das eine reine Interpretationssache des Compilers.
Stringliterale kommen ins Datensegment.

RattuS
2008-04-15, 23:52:34
Stack und Datasegment sind stärker begrenzt (64k?) als der max. allozierbare Heap. Das fällt aber eben erst auf, wenn man größere Strukturen dauerhaft ablegen muss.

Ich behaupte zwar, dass ein statisches Array immer am Stack landet und Heapspeicher mit malloc() angefordert werden muss ...
Eine größere Struktur kann man zwar mit Adresspointern im Stack verwalten, aber das löst ja nicht den Speicher ab. ;)

Edit: Ich schweife etwas ab, da es in der eigentliche Frage ja nur um konstante bzw. kurze Strings in kleineren Arrays geht. ^_^

Coda
2008-04-16, 00:50:49
Der Stack ist z.B. bei VC++ 1MiB default.