C++ 方法作用域外取消引用的char[]指针的有效性

C++ 方法作用域外取消引用的char[]指针的有效性,c++,string,pointers,C++,String,Pointers,我的嵌入式系统(Arduino)上有一个损坏的char[],我怀疑其中有一部分代码。下面是代码(我试图将其概念化,我没有试图编译您阅读的内容)。 基本上,问题是:我是否可以在方法范围外存储指向“abcde”对象的指针(我不知道如何命名“abcd”,它是一个字符的常量数组?) 我观察到*m_ptr内存损坏,“要记住的字符串”在实际代码中损坏(内存中有其他对象)。 我的C个人内存告诉我,保留对未分配对象的引用是无效的。我相信“要记住的字符串”在memory()方法执行过程中出现在堆栈上,但没有保证在

我的嵌入式系统(Arduino)上有一个损坏的char[],我怀疑其中有一部分代码。下面是代码(我试图将其概念化,我没有试图编译您阅读的内容)。 基本上,问题是:我是否可以在方法范围外存储指向“abcde”对象的指针(我不知道如何命名“abcd”,它是一个字符的常量数组?)

我观察到*m_ptr内存损坏,“要记住的字符串”在实际代码中损坏(内存中有其他对象)。 我的C个人内存告诉我,保留对未分配对象的引用是无效的。我相信“要记住的字符串”在memory()方法执行过程中出现在堆栈上,但没有保证在memory()退出后将可用,对吗


整件事是:我不知道C++如何处理引号:)/p>< p>除了代码片段不能是真正的测试用例(因为<代码> < < /代码>没有成员函数名为代码> ReMeNe(代码)> />代码>,<强>您对我们展示的没有什么根本错误。您正在存储一个指向字符串文字的指针,而字符串文字将永远有效

但是,编译器应该警告您将其存储为
常量char*
——从2011年起不存储实际上是非法的

很可能你正在破坏这个文字占用的内存,没有MCVE我们无法知道如何处理也许,在添加了缺少的
常量之后,编译器可以为您捕获错误。但这并不能保证


另外,不要忘记
main

的返回类型,除了您的代码片段不能是真正的测试用例之外(因为
A
没有名为
memory()
)的成员函数,您向我们展示的内容没有根本上的错误。您正在存储一个指向字符串文字的指针,而字符串文字将永远有效

但是,编译器应该警告您将其存储为
常量char*
——从2011年起不存储实际上是非法的

很可能你正在破坏这个文字占用的内存,没有MCVE我们无法知道如何处理也许,在添加了缺少的
常量之后,编译器可以为您捕获错误。但这并不能保证


另外,不要忘记
main

的返回类型此代码是有效的,因为字符串文本存储在静态位置,但这似乎不是一个好做法。
obj.rememble()无法编译。此外,如果您想接受字符串文本,则应使用
const char*
而不是
char*
。此代码有效,因为字符串文本存储在静态位置,但这似乎不是一个好的做法。
obj.remember()无法编译。另外,如果您想要接受字符串文本,那么您应该使用
const char*
而不是
char*
。好的,您让我改变了主意。我将投入必要的时间为您提供一个MCVE,而不仅仅是一个试图描述问题的代码片段。糟糕的是,我使用的库声明了您所说的const char[]。我会带着真正的材料回来的,谢谢@让·伊夫·莱塞涅尔:永远展示你自己。这就是为什么!好吧,你让我改变了主意。我将投入必要的时间为您提供一个MCVE,而不仅仅是一个试图描述问题的代码片段。糟糕的是,我使用的库声明了您所说的const 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();
}