Werden Arrays of pointers zuverlässig mit NULL initialisiert?
-
Hallo, ich wollte fragen ob Pointer Arrays immer mit NULL initialisiert werden. Denn ich habe bisher immer, um festzustellen, ob ein Array ein Element enthält, jedes mit
if(element != NULL)
abgeglichen, was immer funktioniert hat. Nur scheint das in meinem Code nicht mehr zu funktionieren, weil manche elemente mit NULL und andere nicht mit NULL initialisiert werden. Ich ändere das Array allerdings an keinem Punkt. Komischerweise immer auf die gleiche Art, bei einem 6 x 2 großen Array schaut es zum Beispiel immer so aus, egal wie oft ich neu compiliere(X steht für nicht NULL und _ für NULL):
X__X_X
__X_XX
Daher muss ich halt zu Beginn über das Array iterieren und jedem NULL zuweisen. Was mich sehr wundert, ist das sich nicht ändernde Muster der Initialisation, denn wenn nicht-Initialisieren zu UB führt, warum wiederholt es sich jedesmal? Und warum funktioniert es zuverlässig bei anderen Arrays?Liebe Grüße Daniel
-
Für Arrays, Pointer, und auch Arrays von Pointers gelten keine Sonderregeln, das sind ganz normale Werte wie alle anderen auch. Die normalen Regeln sind (in verständlicher Kurzfassung - die ganz genauen Regeln sind sehr technisch):
- Globale Variablen werden genullt. "global" umfasst dabei auch statische Variablen
- Alles andere wird nicht unbedingt mit Null oder gar irgendetwas initialisiert. Da ist es deine Aufgabe als Programmierer, dafür zu sorgen, dass sie nicht uninitialisiert benutzt werden.
- Eine Sonderregel noch: Bei so etwas wie
char langer_string[1000] = "kurzer String";
wird der Rest vonlanger_string
, der nicht mit dem kurzen String initialisiert wird, genullt.
Da du als guter Programmierer natürlich brav globale Variablen vermeidest, und du in C++ ganz selten bis nie mit rohen char-Arrays in Kontakt kommen solltest, brauchst du dir eigentlich nur Regel 2 zu merken. Und falls du doch einmal eine globale Variable hast, dann schadet eine explizite Initialisierung auch nicht.
-
@SeppJ Alles klar, danke; also sollte man immer jedes Array selber mit z.B Null initalisieren
-
@daniel sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
@SeppJ Alles klar, danke; also sollte man immer jedes Array selber mit z.B Null initalisieren
Ja. Wobei in C++ die Alarmglocken schrillen sollten, sowohl bei Array, als auch Pointer, als auch NULL. Das gibt es zwar prinzipiell alles in C++, aber benutzt man eigentlich nie so direkt. Bist du sicher, dass du kein C machst? Falls du C++ machen willst, solltest du dringend überdenken, wie du lernst, denn du lernst anscheinend falsch.
In C gelten übrigens die gleichen Regeln wie ich oben genannt habe.
Das Verhalten, das du bei dir beobachtest, kommt übrigens daher, dass "nicht unbedingt mit Null initialisiert" auch heißen kann, dass es eine Variable zufällig doch mal mit Null initialisiert werden kann. Normalerweise steht da einfach das drin, was an der Stelle vorher im Speicher stand. Solange ein Programmablauf nicht von Nutzereingaben abhängt, ist das normalerweise auch bei jedem Programmstart immer das gleiche, da ja vorher das gleiche passiert ist. Daher siehst du bei jedem Start das gleiche Muster. Solange du dein Programm nicht änderst, wird der Compiler jedes Mal den gleichen Code erzeugen.
-
eigentlich solltest du deine arrays oder variablen mit den werten initialisieren, die dort hinein gehören und den programmablauf so planen, dass zugriffe auf nicht initialisierte daten nicht vorkommen. d.h. z.b. dass der benutzer erst seinen namen eingeben muss, bevor
hallo [benutzername]
ausgegeben werden darf.
-
@Wade1234 Das ist in dem Fall nicht möglich, weil ein Array nach Objekten, die gezeichnet werden sollen, durchsucht wird. Und das Array wird durch vom User kreierte Events gefüllt.
-
@SeppJ Ich weiß schon, dass man immer die STL nutzen soll, aber wenn man es in C so machen kann, geht es doch auch in C++?
-
@daniel dann müsstest du dein programmdesign vielleicht einmal überdenken. und wenn du es wie in C machen willst, warum benutzt du dann kein C?
-
Noch eine Anmerkung zu 3. von Sepp:
das gilt Allgemein für Arrays.
Wenn du beim Initialisieren von Arrays weniger Daten angibst, als Elemente vorhanden sind, wird der Rest mit 0 (Null) aufgefüllt.int *feld[ANZAHL] = {NULL};
reicht für alle Elemente
-
@DirkB sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
int *feld[ANZAHL] = {NULL};
reicht für alle ElementeEs reicht sogar
int* arr[N] = {};
-
@hustbaer sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
Es reicht sogar
int* arr[N] = {};
Es reicht sogar
int* arr[N]{};
-
@Swordfish stümmt
-
@daniel sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
@SeppJ Ich weiß schon, dass man immer die STL nutzen soll, aber wenn man es in C so machen kann, geht es doch auch in C++?
Erfahrungsgemäß führt das immer zu Problemen, da die typischen C++-Sprachmittel nicht kompatibel sind mit den auch vorhandenen C-Sprachmitteln. Daher ist der Ratschlag stets, entweder pures C oder pures C++ zu machen, und niemals zu Mischen. Um korrekt und fehlerfrei zu Mischen muss man sich in beiden Sprachen ziemlich gut auskennen. Aber in dem Fall hat man keinen Vorteil, weil man mit solchen Kenntnissen in jeweils beiden Sprachen bessere, nicht-gemischte Programme schreiben könnte.
Hingegen sieht man den Willen zum Mischen sehr oft bei Anfängern, die es nicht besser wissen, und daher dann auch stets all die Fehler machen, die sich so einfach vermeiden ließen, wenn man nur das Mischen ließe. Und das ganz ohne Not und ohne guten Grund.
-
@SeppJ sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
[...]
Kurz und für diesen Fall auf den Punkt:
std::array<>
ftw.
-
@Swordfish sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
@SeppJ sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
[...]
Kurz und für diesen Fall auf den Punkt:
std::array<>
ftw.Das klingt nicht nach einem statischen Anwendungsfall:
@daniel sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
@Wade1234 Das ist in dem Fall nicht möglich, weil ein Array nach Objekten, die gezeichnet werden sollen, durchsucht wird. Und das Array wird durch vom User kreierte Events gefüllt.
Also, wie fast immer,
std::vector
. Ist nicht ohne Grund die erste Wahl für Container bis zum Beweis des Gegenteils.Dann fallen höchstwahrscheinlich auch direkt Nullpointer und Pointer allgemein raus, da man keinen Mechanismus mehr braucht, um ungefüllte Werte zu markieren. Und deshalb schrieb ich irgendwo ganz oben mal, dass Arrays, Pointer und NULL allesamt Zeichen sind, dass man in C++ etwas falsch macht.
-
@daniel sagte in Werden Arrays of pointers zuverlässig mit NULL initialisiert?:
@SeppJ Ich weiß schon, dass man immer die STL nutzen soll, aber wenn man es in C so machen kann, geht es doch auch in C++?
Nur weil es geht, ist es noch lange nicht gut. Man kann vieles tun, und einiges akzeptiert der Compiler sogar. Aber bei professioneller Softwareentwicklung geht es nicht mehr darum, dass man etwas "irgendwie macht", sondern dass man etwas mit möglichst geringer Fehlerquote umsetzt. Und die Fehlerquote ist bei C-C++-Mischmasch erfahrungsgemäß höher als wenn man etwas sauber mit der STL umsetzt und bewährte Konzepte nutzt.
Fehlersuche ist teilweise sehr aufwändig und kostet Zeit. Daher ist es immer eine gute Idee von vornherein zu versuchen, die Fehlerquote zu minimieren.
-
Es reicht sogar
int* arr[N] = {};
Das ist in C ein Syntaxfehler.
Es passiert immer wieder, dass in C++ irgendwelche Annahmen getroffen werden, aus der "Erfahrung" heraus, es ist ja bisher immer gut gegangen.
-
@Wutz Nachdem wir hier im C++ Unterforum sind und nicht im C: OK. So what?
-
@hustbaer Die Leute (Anfänger und von Professoren betrogene) kommen alle an und sagen, das C++ auf C aufbaut.
In C++ brauchen wir keine Zeiger.
In C++ brauchen wir keine Arrays aus Zeigern.Wir haben Inhalte. Dort, wo wir keine Inhalte haben gibt es auch nichts zu speichern. Fertig.
-