动态创建字节数组后,观察中的符号数量意外

时间:2013-10-18 12:08:47

标签: c++ bytearray

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

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

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

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

6 个答案:

答案 0 :(得分:3)

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

test,8

你应该只看到8个测试值。但是,显示的值不会更有意义,因为在您显示的代码段之后它们仍然未初始化。

答案 1 :(得分:2)

我不知道“Watch”是什么(可能是调试器中的某些内容?),但只是指针,它无法知道你分配了多少内存。可能,它假定指针指的是C样式的可打印字符串,后跟零终止符,并显示它找到的所有内存,直到它到达零值字节。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

因为您的可视化工具与您的数组一起工作,因为它是字符数组。它试图将它显示为一个以“\ 0”结尾的字符串。

所以你看到的是未初始化的记忆。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

test是指c-stringc-string的结尾标有\0

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


为什么说test具有不确定的价值?

当你使用new时,如下面的陈述,

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

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

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

  

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

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

让我们理解它是否真的是默认初始化或者是否没有执行初始化。

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

  

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

     
      
  • 如果T是(可能是cv-quali fi ed)类类型(第9条),则调用默认构造函数(12.1)或T(如果T没有默认构造函数或重载解析,则初始化是错误的(13.3)导致歧义或在初始化的上下文中删除或无法访问的函数中;;
  •   
  • 如果T是数组类型,则每个元素都是默认初始化的;
  •   
  • 否则,不会执行初始化。
  •   

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


解决方案

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

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