Dynamisches Array + Hyroglyphen


#1
Hi,

kann mir mal jemand sagen wie man ein char Array richtig erstellt bzw. initialisiert, jedesmal wenn ich mit char arbeite stehen Hyroglyphen in meinem Array.

Hier ein Beispiel:

Code:
        int M = 500; // grösse eigentlich unbekannt
        char *DATA = new char[M];
        if(DATA != NULL)
        {
                DATA[0] = 'a';
                ShowMessage(DATA);

                delete(DATA);
                DATA = NULL;
        }
in der Ausgabe steht dann dieser MÜLL "a¾è".


So um den Hyroglyphen-KRAM aus dem Speicher zu löschen
kann man es ja auch so machen:

Code:
        int M = 500; // grösse eigentlich unbekannt
        char *DATA = new char[M];
        if(DATA != NULL)
        {
                for(int g=0; g < M; g++)
                        DATA[g] = '\0';

                DATA[0] = 'a';
                ShowMessage(DATA);

                delete(DATA);
                DATA = NULL;
        }
in der jetzigen Ausgabe steht das was da auch stehen soll nähmlich "a".

Jetzt möchte ich eigentlich nur eines wissen ob man das so generell (nullterminiert) macht oder ob es einen anderen Weg gibt ?
 
Zuletzt bearbeitet:

CSANecromancer

Erfahrenes Mitglied
#2
Jetzt möchte ich eigentlich nur eines wissen ob man das so generell (nullterminiert) macht oder ob es einen anderen Weg gibt ?
Da man sich generell in C++ (unabhängig vom Betriebssystem und Framework) darauf geeinigt hat, Strings immer nullterminiert zu behandeln ist die zweite Methode die passende, wenn du deine Strings zeichenweise (z.B. mittels DATA[0] = 'a'; ) aufbauen willst. Der wesentliche Unterschied in deinen beiden Varianten besteht darin, dass im ersten Fall, wie du schon sagtest, aller möglicher Müll in dem für das Array reservierten Speicher stehen kann. Die Ausgabe des Strings endet aber erst mit dem ersten '\0'. Genau das ist aber bei deiner zweiten Variante gegeben.

Wenn du also mit Strings arbeiten willst und die jeweiligen Char-Arrays einzeln von Hand füllst (z.B. bei Fileoperationen), dann empfiehlt es sich immer, wie in deinem zweiten Beispiel, vorher den verwendeten Speicher auf \0 zu setzen.
 
Zuletzt bearbeitet:
#3
Hi,

Danke für Deine geniale Antwort.
Die Ausgabe des Strings endet aber erst mit dem ersten '\0'.
ich habe es natürlich gleich ausprobiert:

Code:
int M = 500; // grösse eigentlich unbekannt
char *DATA = new char[M];
if(DATA != NULL)
{
         DATA[0] = 'a';
         DATA[1] = '\0';
         ShowMessage(DATA);

         delete(DATA);
         DATA = NULL;
}
Die Ausgabe ist nun "a" auch ohne das der reservierte Speicher extra durch die Schleife muss, echt genial, DANKE !