【问题标题】:Const char* weird behaviorconst char* 奇怪的行为
【发布时间】:2016-09-30 09:40:21
【问题描述】:

您好,我遇到了 const char* 以一种奇怪的方式相同的问题。 Color::Text() 返回一个静态 char 数组,但它也用于初始化数组的 const char* 指针。

如果我想让 rofl::Default 实际工作而不是它 Color::Text 生成的最新“const char”,我该怎么办?

#include <windows.h>
class Color
{
public:
    int R;
    int G;
    int B;
    int A;
    Color(int r, int b, int g, int a = 255)
    {
    R = r;
    G = g;
    B = b;
    A = a;
    }
    const char* Text()
    {
    static char Texts[124];
    snprintf(Texts, 124, "%i %i %i %i", R, G, B, A);
    return Texts;
    }
}
class rofl
{
public:
    const char* Default;
    const char* Value;
    rofl(const char* d)
    {
        Default = d;
        Value = d;
    }
}

rofl dood("0");
rofl doaaod(Color(0,0,0).Text());
rofl xxxx(Color(0,55,0).Text());

int main()
{
    printf("%s %s\n", dood.Default, dood.Value);
    printf("%s %s\n", doaaod.Default, doaaod.Value);
    printf("%s %s\n", xxxx.Default, xxxx.Value);
    return 0;
}

输出是:

0 0
0 55 0 0 0 0
0 55 0 0 55 0

【问题讨论】:

  • rofl的构造函数中为DefaultValue创建一个缓冲区(例如使用new)指向。然后将数据复制到这些缓冲区。更好的是,使用std::string 对象而不是char *,动态分配将为您管理干净。

标签: c++ static undefined-behavior behavior


【解决方案1】:

您的代码中只有一个字符缓冲区(文字字符串除外)。 const char* 是指向字符缓冲区的指针,而不是作为原始缓冲区副本的新缓冲区。

因此,很自然,每次调用 Color::Text 时,您都在同一个字符缓冲区上写入,所有指向它的指针都将读取相同的内容。

您必须了解 C 和 C++ 中指针的概念。

在这种情况下,在 C++ 中,对于您需要的行为,您应该将所有使用的 const char* 替换为 std::string

我向您推荐《Accelerated C++》一书,以便轻松学习 C++,而无需深入了解该语言中有点过时的细节。

【讨论】:

  • 我不能像 std::string 这样使用垃圾
  • @Lolmelon:你的问题被标记为c++。如果你不能使用 C++,不要这样标记它。
  • @Lolmelon:“垃圾”?
  • @Lolmelon,std::string 不是垃圾。您决定是要学习现代 C++ 还是 1970 年代风格的编程。在这种情况下,请阅读“C 编程语言”,最终您将完全理解您的代码存在的问题。
猜你喜欢
  • 2012-10-20
  • 2023-03-14
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2012-06-01
  • 2017-03-13
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多