Unterschied char myCharArray[100] und char* pMyArray = new char[100]



  • Hallo,

    ich rufe eine Funktion auf, die einen char-Buffer übergeben bekommt.

    Wenn ich die Funktion folgendermaßen aufrufe

    char myCharArray[100];
    SomeFunction(myCharArray);
    

    enthält myCharArray den gewünschten Text und ist offensichtlich mit '\0" terminiert.

    Wenn ich das stattdessen folgendermaßen mache

    int iNumChars = GetNumCharsToReceive();
    char* pMyCharArray = new char[iNumChars + 1];
    SomeFunction(pMyCharArray);
    

    erhalte ich zwar auch den gewünschten Text, allerdings fehlt anscheinend das abschließende '\0'.
    Muss ich das im zweiten Fall immer selbst anfügen, oder mache ich hier grundsätzlich was falsch.

    Wäre dankbar für eine kurze Erläuterung.



  • Der 0er fehlt, du musst ihr selbst anfügen, richtig.



  • Danke für die Info.

    Mir ist allerdings nicht ganz klar, warum das im ersten Fall anders ist. Wenn die Funktion, die den Buffer befüllt nicht dafür sorgt, dass '\0' an das Ende gesetzt wird, sollte das doch in beiden Fällen so sein, oder?

    Ist aber eigentlich nicht so wichtig. Es hätte mich einfach interessiert, ob es diesbezüglich einen Unterschied gibt, ob ich das char-array dynamisch erzeuge, oder nicht.



  • CharArrayUser schrieb:

    Wenn ich die Funktion folgendermaßen aufrufe

    char myCharArray[100];
    SomeFunction(myCharArray);
    

    enthält myCharArray den gewünschten Text und ist offensichtlich mit '\0" terminiert.

    Wenn ich das stattdessen folgendermaßen mache

    int iNumChars = GetNumCharsToReceive();
    char* pMyCharArray = new char[iNumChars + 1];
    SomeFunction(pMyCharArray);
    

    erhalte ich zwar auch den gewünschten Text, allerdings fehlt anscheinend das abschließende '\0'.

    Wenn im zweiten Fall die '\0' am Ende fehlt, dann scheint die Funktion SomeFunction einfach keine Nullterminierung zu erzeugen. Dass es im ersten Fall zu klappen scheint, kann man mit "Glück" erklären, oder damit, dass Du uns nicht den richtigen Code gezeigt hast. In keinem Fall garantiert der C++ standard, dass die char-Werte irgend eine bestimmte Belegung haben vor dem Aufruf Deiner Funktion. Wenn Du den ersten so abänderst:

    char myCharArray[100] = {};
    

    ist garantiert, dass alle Elemente des char-Arrays mit 0 initialisiert werden bevor die Funktion aufgerufen wird.

    CharArrayUser schrieb:

    Muss ich das im zweiten Fall immer selbst anfügen, oder mache ich hier grundsätzlich was falsch.

    Ich tippe auf letzteres.



  • Ich empfehle die Benutzung von std::vector, damit erschlägst du sowohl die Initialisierung mit 0 als auch das fehlende delete[] in deinem Code.

    #include <vector>
    
    int main()
    {
       std::vector<char> Buffer( GetNumCharsToReceive() +1 );
       SomeFunction( &Buffer[0] );
    }
    

    Es sei denn, du möchtest explizit C und kein C++ programmieren.



  • DocShoe schrieb:

    Ich empfehle die Benutzung von std::vector, damit erschlägst du sowohl die Initialisierung mit 0 als auch das fehlende delete[] in deinem Code.

    #include <vector>
    
    int main()
    {
       std::vector<char> Buffer( GetNumCharsToReceive() +1 );
       SomeFunction( &Buffer[0] );
    }
    

    Es sei denn, du möchtest explizit C und kein C++ programmieren.

    aber wenn er dann schon auf die stl zurückgreift kann er auch gleich std::string nehmen...

    this->CEdit::removeSpellingMistakes(this->m_content);



  • Ich Empfehle das Weglassen des ekelhaften C Präfixes und der m_ Präfixe für besser lesbaren Code.


Anmelden zum Antworten