【问题标题】:single character c-style string full of junk充满垃圾的单字符 c 风格字符串
【发布时间】:2011-06-04 19:30:19
【问题描述】:

很遗憾,我无法弄清楚关于 c++ 的这些基本知识,但 c 风格的字符串的行为与我意料之外的一样。例如,我这样创建它: char* cstr = new char[1];

初始化为:Íýýýý««««««««îţ。像往常一样,我可以只设置第一个字符,因为其他字符并不真正存在(或者我认为它们不存在)。在使用 c 风格的字符串时,所有这些垃圾都被处理了,一切正常。

现在我将 std::string 与那些 c-stlye 混合在一起,我得到的是一团糟。用这段代码:

std::string str = "aaa";

str += cstr;

我最终得到了:aaaÍýýýý«««««««««îţ ,但现在这些字符实际上存在,因为 string.size() 返回包含此垃圾的长度。

我不知道为什么会发生这种情况,但它必须连接到创建字符串,因为像 char* cstr = "aaa" 这样的东西会导致 aaa 没有任何额外的垃圾,但是尝试更改以这种方式初始化的字符串会导致内存访问冲突。有人可以解释一下这种行为吗?谢谢!

PS:我的 JavaScript 加载失败,如果有人能正确格式化这篇文章,我会很高兴!

回答:天哪!我怎么能忘记这一点...感谢所有人,嗯,立即回答。最好的是来自 minitech,所以我会在我的 java 脚本加载后立即将其标记为答案:/

【问题讨论】:

    标签: c++ string char


    【解决方案1】:

    所有 C 风格的字符串都以 null 结尾。因此,使用new char[1] 初始化的字符串会为您留下没有字符的空间。您不能将第一个字符设置为除\0 之外的任何字符,否则正常的字符串操作将继续读入内存,直到找到零为止。所以请改用new char[2]

    【讨论】:

      【解决方案2】:

      使用 C 风格的字符串时,您需要有一个空终止符:

      char* cstr = new char[2];
      cstr[0] = 'X';
      cstr[1] = '\0';
      

      说了这么多,做上面的代码真的很糟糕。只需使用std::string,除非您有充分的理由。它会为您处理内存分配和释放。

      【讨论】:

        【解决方案3】:

        C 风格的字符串需要NUL ('\0') 终止符;它们没有像 C++ 字符串那样的长度。所以你的单字符串一定是new char[2];它不会被初始化;并且您需要确保它以\0 终止。

        【讨论】:

          【解决方案4】:

          当您使用new char[1] 时,您为字符数组请求空间。没有要求初始化所述字符。因此,您看到的“垃圾”是未初始化的内存。在将数组视为 C 风格的字符串之前,您应该这样做:

          cstr[0] = '\0';
          

          【讨论】:

            【解决方案5】:

            c 风格的字符串是 NULL 分隔的。因此,要忽略内存中的任何垃圾,您需要在字符串正文中放置 NULL 字节('\0')。否则,系统库函数将查看以字符串开头的所有字节,直到它们在内存中遇到 NULL 字节(将在某个随机位置)。

            这也意味着要拥有一个字符的 c 样式字符串,您实际上需要分配 2 个字节:一个用于有意义的字符,第二个用于'\0'

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-01-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-05
              • 1970-01-01
              • 2013-02-25
              • 1970-01-01
              相关资源
              最近更新 更多