C++ 动态创建字节数组后,监视中出现意外的符号数量

C++ 动态创建字节数组后,监视中出现意外的符号数量,c++,bytearray,C++,Bytearray,请你解释一下,我该如何理解以下行为: typedef unsigned char byte; byte * test = new byte[8]; 这是我在手表上看到的测试值:ÍÍÍÍÍÍýýý«««««««««««««««««««»»ý 为什么会这样?为什么我看到的是24个符号,而不是8个?Studio将test视为一个C字符串,一个以\0结尾的字符数组。它不会影响程序的功能,只是调试器试图变得聪明。,因为可视化程序使用数组就像使用字符数组一样。它试图将其显示为以“\0”结尾的字符串

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

typedef unsigned char byte;    
byte * test = new byte[8];
这是我在手表上看到的测试值:ÍÍÍÍÍÍýýý«««««««««««««««««««»»ý


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

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

,因为可视化程序使用数组就像使用字符数组一样。它试图将其显示为以“\0”结尾的字符串


因此,您看到的是未初始化的内存。

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

我不知道“手表”是什么(可能是调试器中的某个东西?),但只要给出一个指针,它就无法知道您分配了多少内存。很可能,它假设指针引用一个可打印字符的C样式字符串,后跟一个零终止符,并显示它找到的所有内存,直到它到达一个零值字节。

由于您动态分配了数组,调试器无法从类型中知道数组有多大。某些编译器(例如Visual Studio)允许特殊表达式将指针解释为数组(例如,请参见)。在您的情况下,您可以尝试

test,8
您应该只看到test的8个值。但是,显示的值没有多大意义,因为在显示代码段后,它们仍然未初始化。

为什么在数组的动态内存分配后会出现意外数量的符号?
test
指的是
c-string
c-string
的结尾由
\0
标记

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


为什么说
test
具有不确定值? 当您使用以下语句中的
new

unsigned char *p_dynamic_alloc = new unsigned char[8];
返回指向无符号字符的指针,该指针指向数组第一个元素的地址。动态内存大小:
8*sizeof(unsigned char)
已分配。未提及初始值设定项

让我们了解
new
如何在不使用初始值设定项的情况下处理动态分配:

[C++11:§5.3.4/15]:创建T类型对象的新表达式初始化 该目标如下:

  • 如果省略了新的初始值设定项,则对象默认已初始化(8.5)如果未执行初始化,则对象的值不确定。
  • 否则,新的初始值设定项将根据8.5的初始化规则进行解释,以进行直接初始化
让我们了解它是真正的默认初始化还是没有执行初始化

默认初始化(无符号字符*)如下所示:

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

  • 如果T是(可能是cv限定的)类类型(第9条),则调用默认构造函数(12.1)或T(如果T没有默认构造函数或重载解析(13.3)导致歧义或从初始化上下文中删除或无法访问的函数,则初始化是错误的)
  • 如果T是数组类型,则每个元素默认初始化
  • 否则,不执行初始化。
这意味着正如前面指出的,对象具有不确定的值。


解决方案 正确初始化动态字节数组:

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

你应该接受其中一个答案来结束这个问题。如果你对答案感到满意,那就是。我想你的问题回答对了。有关更多信息,请查看常见问题解答谢谢,这很有意义。我有一个想法,我看到的所有额外字符都是在8字节之后的内存中,但为什么它们总是相同的?但是,当我声明两个这样的变量时,我总是看到相同的字符“在测试指向的最后一个字符和调试器找到的第一个\0之间”。为什么?看起来调试器对所有未初始化的对象使用相同的(垃圾)值来让程序员知道问题。请使用编译器、调试器和您正在使用的其他相关详细信息更新您的问题。