【问题标题】:Validity of a dereferenced char[] pointer outside method scope方法范围外取消引用的 char[] 指针的有效性
【发布时间】:2016-06-06 14:54:54
【问题描述】:

我的嵌入式系统 (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() 方法执行期间“要记住的字符串”在堆栈上,但没有保证在 remember() 退出后可用,对吧?

整件事是:我不知道 C++ 如何处理引号之间的那些东西 :)

【问题讨论】:

  • 此代码有效,因为字符串文字存储在静态位置,但这似乎不是一个好习惯。
  • obj.remember(); 无法编译。
  • 另外,如果你想接受字符串文字,那么你应该使用const char * 而不是char *

标签: c++ string pointers


【解决方案1】:

除了您的代码 sn-p 不能是 真正的 测试用例(因为 A 没有名为 remember() 的成员函数)这一事实之外,根本没有什么问题你已经向我们展示了。您正在存储一个指向字符串文字的指针,并且字符串文字永远存在。

但是,您的编译器应该警告您将其存储为 const char* — 实际上自 2011 年以来不这样做是非法的。

很可能您正在破坏此文字占用的内存,如果没有 MCVE,我们无法知道如何。 也许,在您添加了缺少的const 之后,您的编译器可以为您捕捉到您的错误。但这绝不能保证。

另外,不要忘记main 的返回类型。

【讨论】:

  • 好吧,你让我改变了主意。我将投入必要的时间为您提供 MCVE,而不仅仅是尝试描述问题的代码 sn-p。我的错,我使用的库声明 const char[] 正如你所说的那样。我会带着真材实料回来的,谢谢!
  • @Jean-yvesLeseigneur:总是展示你的minimal reproducible example。这就是为什么!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2011-12-10
  • 2019-05-23
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多