请您解释一下,我应该如何理解以下行为:
typedef unsigned char byte;
byte * test = new byte[8];
以下是我在手表中可以看到的测试值:ÍÍÍÍÍÍÍÍýýýý«««««««««îþþ
为什么会这样?为什么我看到24个符号,而不是8个?
答案 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-string
。 c-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]();