【问题标题】:Unexpected amount of symbols in watch after creating byte array dynamicly动态创建字节数组后,手表中出现意外数量的符号
【发布时间】:2013-10-27 06:39:51
【问题描述】:

您能否解释一下,我应该如何理解以下行为:

typedef unsigned char byte;    
byte * test = new byte[8];

这是我在手表中可以看到的测试值:ÍÍÍÍÍÍÍÍýýýý«««««««îþîþ

为什么会这样?为什么我看到的是 24 个符号,而不是 8 个?

【问题讨论】:

  • 您应该接受其中一个答案以结束问题。如果您对答案感到满意。我认为您的问题已得到正确回答。有关更多信息,请查看常见问题解答stackoverflow.com/about

标签: c++ bytearray


【解决方案1】:

由于您动态分配了数组,因此调试器不知道数组的类型有多大。一些编译器(例如 Visual Studio)允许特殊表达式将指针解释为数组(参见例如 View array in Visual Studio debugger?),在您的情况下,您可以尝试

test,8

而且您应该只看到 test 的 8 个值。但是,显示的值不会更有意义,因为在您显示 sn-p 之后它们仍未初始化。

【讨论】:

  • 谢谢,这是有道理的。我有一个想法,我看到的所有额外字符都在我的 8 个字节之后在内存中,但是为什么它们总是一样的呢?
【解决方案2】:

我不知道“Watch”是什么(也许是在您的调试器中?),但只给出一个指针,它无法知道您分配了多少内存。可能,它假定指针指向一个 C 风格的可打印字符字符串,后跟一个零终止符,并显示它找到的所有内存,直到它到达一个零值字节。

【讨论】:

    【解决方案3】:

    为什么在数组动态内存分配后会看到意外数量的符号?

    test 指的是c-stringc-string 的结尾由 \0 标记。

    test 未在问题中发布的程序中明确初始化。 test 具有不确定值,因此您不能指望 \0 恰好在 c-string 结束之后出现。 您在调试器中看到的额外字符是存在于 test 指向的最后一个字符和调试器找到的第一个 \0 之间的字符。 p>


    为什么说test有不确定值?

    当您在下面的语句中使用new 时,

    unsigned char *p_dynamic_alloc = new unsigned char[8];
    

    返回一个指向unsigned char 的指针,它指向数组第一个元素的地址。动态内存大小:8 * sizeof (unsigned char) 已分配。没有提到初始化器。

    让我们了解new 在没有初始化器的情况下如何处理动态分配:

    [C++11: §5.3.4/15]:创建 T 类型对象的 new-expression 初始化 该对象如下:

    • 如果 new-initializer 被省略,则对象默认初始化 (8.5); 如果不进行初始化,则该对象具有不确定的值。
    • 否则,new-initializer 会根据 8.5 的初始化规则进行解释以进行直接初始化。

    让我们了解它是真的默认初始化还是没有执行初始化。

    默认初始化(unsigned char*)表示为,

    [C++11: §8.5/7]:默认初始化 T 类型的对象意味着:

    • 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用默认构造函数 (12.1) 或 T(如果 T 没有默认构造函数或重载决议 (13.3),则初始化是非良构的)导致歧义或导致从初始化上下文中删除或无法访问的函数);
    • 如果 T 是数组类型,则每个元素都是默认初始化的;
    • 否则,不执行初始化。

    这意味着如前所述,对象具有不确定的价值。


    解决方案

    正确初始化你的动态字节数组:

    byte *test = new byte[8]();
    

    【讨论】:

    • 但是,当我声明几个这样的变量时,我总是看到相同的字符“在 test 指向的最后一个字符和调试器找到的第一个 \0 之间”。为什么?
    • 看起来您的调试器对所有 未初始化 对象使用相同的(垃圾)值,让程序员知道问题所在。请使用您正在使用的编译器、调试器和其他相关详细信息更新您的问题。
    【解决方案4】:

    Studio 将 test 视为 C 字符串,即以 \0 结尾的字符数组。它不会影响程序的运行,只是调试器试图变得聪明。

    【讨论】:

      【解决方案5】:

      因为您的可视化工具与您的数组一起使用,因为它是字符数组。它尝试将其显示为应该以 '\0' 结尾的字符串。

      所以你看到的是未初始化的内存。

      【讨论】:

        【解决方案6】:

        test 的值未初始化,您不必担心它是什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-18
          • 1970-01-01
          • 2019-09-16
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多