2016-06-06 6 views
0

Ich habe eine beschädigte char [] auf meinem eingebetteten System (Arduino) und ich vermute einen Teil des Codes. Hier ist der Code (nun, ich habe versucht, es zu konzeptualisieren, ich habe nicht versucht zu kompilieren, was Sie gelesen haben). Grundsätzlich , ist die Frage: Kann ich speichere einen Zeiger auf ein „ABCDE“ Objekt außerhalb eines Verfahrens Umfang (ich weiß nicht, wie „ABCD“ zu nennen, ist es eine Konstante Array von char?)Gültigkeit eines dereferenzierten Char [] Pointer außerhalb der Methode Gültigkeitsbereich

class A { 
    public: 
    void store(char *ptr_char) { 
     m_ptr=ptr_char; 
    } 
    void useit() { 
     // is *m_ptr valid here ? 
     printf("%s",m_ptr); 
    } 

private : 
    char *m_ptr; 
} 

class B : A { 
    void remember() { 
     store ("string to remember"); 
    } 
} 

main() { 
    B obj; 

    obj.remember(); 
    obj.useit(); 
} 

Ich beobachte Korruption von * m_ptr Speicher, "Zeichenfolge zu erinnern" ist im realen Code beschädigt (mit anderen Objekten im Speicher). Mein persönlicher C-Speicher sagt mir, dass es nicht zulässig ist, einen Verweis auf ein nicht zugeordnetes Objekt zu behalten. Ich glaube "String to remember" war auf dem Stack während der Ausführung der remember() -Methode, aber es gibt keine Garantie, dass es verfügbar sein wird, nachdem remember() beendet wurde, oder?

Die ganze Sache ist: Ich weiß nicht, wie C++, diese Dinge in Anführungszeichen behandelt :)

+0

Dieser Code ist gültig, da Zeichenfolgenliterale an einem statischen Speicherort gespeichert werden. Dies scheint jedoch keine gute Vorgehensweise zu sein. – MikeCAT

+2

'obj.remember();' kann nicht kompiliert werden. – NathanOliver

+0

Auch wenn Sie Zeichenfolgenliterale akzeptieren möchten, sollten Sie ein 'const char *' nicht ein 'char *' verwenden. – NathanOliver

Antwort

3

Abgesehen von der Tatsache, dass Ihr Code-Snippet nicht den echten Testfall sein kann (weil A keine Memberfunktion hat benannt remember()), Es gibt nichts grundsätzlich falsch mit dem, was Sie uns gezeigt haben. Sie speichern einen Zeiger auf ein Zeichenfolgenliteral, und Zeichenfolgenliterale bleiben für immer bestehen.

Allerdings sollte der Compiler Sie warnen, es als const char* zu speichern — es ist eigentlich illegal nicht seit 2011

Es ist wahrscheinlich, dass Sie den Speicher sind korrumpiert durch diese wörtliche aufgenommen, und es gibt keine Möglichkeit, wir wissen, wie ohne MCVE. Vielleicht, nachdem Sie die fehlenden const hinzugefügt haben, kann Ihr Compiler Ihren Fehler für Sie abfangen. Aber das ist keineswegs garantiert.

Vergessen Sie auch nicht Ihren Rückgabetyp für main.

+0

Ok, du hast mich dazu gebracht, meine Meinung zu ändern. Ich werde die notwendige Zeit investieren, um Ihnen ein MCVE zu geben, nicht nur ein Code-Snippet, das versucht, das Problem zu beschreiben. Und meine schlechte, die Bibliothek, die ich benutze, erklärt const char [], wie du es gesagt hast. Ich werde mit echtem Material zurück sein, danke! –

+0

@ Jean-yvesLeseigneur: _Always_ präsentieren Sie Ihre [MCVE]. Deshalb! –

+0

Ja; Das erste Mal hier, ich habe meine Lektion gelernt :) –

Verwandte Themen