我的嵌入式系统(Arduino)上有一个损坏的char [],我怀疑是一部分代码。这是代码(好吧,我试图概念化它,我没有尝试编译你读的内容)。 基本上,问题是:我可以在方法范围外存储指向“abcde”对象的指针(我不知道如何命名“abcd”,它是一个常量的char数组吗?)
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();
}
我观察到* m_ptr内存的损坏,“要记住的字符串”在现实代码中被破坏(内存中的其他对象)。 我的C个人记忆告诉我,保持对未分配对象的引用是无效的。我记得,在记住()方法执行时,“要记住的字符串”在堆栈中,但是在退出remember()之后没有保证可用,对吧?
整个问题是:我不知道C ++如何在引号之间处理这些事情:)
答案 0 :(得分:3)
除了您的代码段不能是真正的测试用例(因为A
没有名为remember()
的成员函数),没有任何根本错误用你向我们展示的东西。您正在存储指向字符串文字的指针,字符串文字将永远存在。
但是,您的编译器应该警告您将其存储为const char*
- 从2011年开始它实际上是非法的。
很可能你正在破坏这个文字占用的内存,而且如果没有MCVE,我们就无法知道如何。 也许,在您添加了缺失的const
后,您的编译器可以为您捕获错误。但这绝不是保证。
另外,请不要忘记main
的返回类型。