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的初始化规则进行解释,以进行直接初始化
- 如果T是(可能是cv限定的)类类型(第9条),则调用默认构造函数(12.1)或T(如果T没有默认构造函数或重载解析(13.3)导致歧义或从初始化上下文中删除或无法访问的函数,则初始化是错误的)李>
- 如果T是数组类型,则每个元素默认初始化李>
- 否则,不执行初始化。
解决方案 正确初始化动态字节数组:
byte *test = new byte[8]();
你应该接受其中一个答案来结束这个问题。如果你对答案感到满意,那就是。我想你的问题回答对了。有关更多信息,请查看常见问题解答谢谢,这很有意义。我有一个想法,我看到的所有额外字符都是在8字节之后的内存中,但为什么它们总是相同的?但是,当我声明两个这样的变量时,我总是看到相同的字符“在测试指向的最后一个字符和调试器找到的第一个\0之间”。为什么?看起来调试器对所有未初始化的对象使用相同的(垃圾)值来让程序员知道问题。请使用编译器、调试器和您正在使用的其他相关详细信息更新您的问题。