Struktur initialisierung
-
Guten,
typedef struct _bla { char *bla1; char *bla2; int asdf; } bla; int foo() { bla ar[100] = {}; .. return 0; }
wird hier garantiert dass jeder Pointer (ar.bla1 usw.) ein NULL-Pointer ist?
-
Nein! Das Objekt wird nur auf dem Stack erstellt und mit den Werten in den geschweiften Klammern gefühlt. Und diese sind leer.
-
Doch! "Excess Elements" (überzählige Elemente) bei der Angabe eines Initialisierers werden mit 0 initialisiert.
Ich bin mir allerdings nicht sicher, ob die leere Klammer in C erlaubt ist. In C89 muss m.W. mindestens ein Element angegeben werden.
-
Somit wäre ich mit
int foo() { bla ar[100] = {0}; .. return 0; }
also auf der sicheren Seite?
-
Ich habs eben auf codepad getestet und da ging die Variante ohne Null in der Klammer. Also entweder du vertraust LordJaxom und deinem Compiler. Oder du wartest bis jemand den Standard zitiert. Das heißt aber noch lange nicht, dass sich alle deine Compiler an den Standard halten. Ich bevorzuge in solchen Fällen, wenn es geht, sich auf Statements zu beschränken, die ein fehlerhafter Compiler nicht fehlinterpretieren kann. In deinem Fall jetzt die Elemente einzeln über eine Schleife zu setzen oder alle Nullen in den Code zu schreiben. Wenn du dich auf einen Compiler beschränkst ist das natürlich unnötig. Dann musst du nur einmal das Verhalten testen und gut. Sonst gibt es aber auch recht große Unterschiede zwischen verschieden Versionen. Ich denke da nur an VS6 zu VS.net. Und diese Versionen werden heute noch eingesetzt.
-
Ok, Danke.
Wäre schön wenn noch jemand was im Standard finden würde - ich finde da nix@Paul Müller
Naja, in einer Schleife? Alternative wäre eher memset :p
Aber auf Compiler die sich nicht mal an den C89 Standard halten wird keine Rücksicht genommen. Da kann man ja auch nicht drauf vertrauen dass 1+1 = 2 sind.
-
cooky451 schrieb:
Somit wäre ich mit
int foo() { bla ar[100] = {0}; .. return 0; }
also auf der sicheren Seite?
Ja.
Leere Klammer ist compilerspezifisch.
-
cooky451 schrieb:
Naja, in einer Schleife? Alternative wäre eher memset :p
Macht auch nichts anderes. Damit kapselst du die Schleife nur. Geh mal davon aus, dass ein Compiler eine Schleife besser optimieren kann, als einen Funktionsaufruf, wenn es dir um Zeit geht.
cooky451 schrieb:
Aber auf Compiler die sich nicht mal an den C89 Standard halten wird keine Rücksicht genommen. Da kann man ja auch nicht drauf vertrauen dass 1+1 = 2 sind.
Doch darauf kann man eben vertrauen, dass eindeutige Dinge, richtig funktionieren. Sonst könntest du dir auch die Alternativ-Lösung sparen.
Falls bei dir trotzdem 1+1!=2 sind, dann liegt das an deiner Hardware und die rechnet dann mit jedem Compiler falsch.
-
Paul Müller schrieb:
cooky451 schrieb:
Naja, in einer Schleife? Alternative wäre eher memset :p
Macht auch nichts anderes. Damit kapselst du die Schleife nur. Geh mal davon aus, dass ein Compiler eine Schleife besser optimieren kann, als einen Funktionsaufruf, wenn es dir um Zeit geht.
Das kann man so nicht sagen. Häufig sind nämlich gerade diese Funktionen hochoptimiert.
-
Ich hab mir mal verschiedene Optimierungen angesehen und die wesentliche Optimierung bestand darin, die ganze Datenbreite auszunutzen. Und mehr kann ich mir jetzt auch nicht auf Assemblerebene vorstellen.
Sicher werden die Standard-Funktionen aber geinlined. Die Frage ist nur, ob das in C89 schon geht. Solange eine nicht geinlinede Version der Funktion zur Verfügung steht, dürfte das aber keine Probleme bereiten.