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 :)
Dieser Code ist gültig, da Zeichenfolgenliterale an einem statischen Speicherort gespeichert werden. Dies scheint jedoch keine gute Vorgehensweise zu sein. – MikeCAT
'obj.remember();' kann nicht kompiliert werden. – NathanOliver
Auch wenn Sie Zeichenfolgenliterale akzeptieren möchten, sollten Sie ein 'const char *' nicht ein 'char *' verwenden. – NathanOliver