0

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

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

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

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

4

6 回答 6

3

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

test,8

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

于 2013-10-18T12:15:53.657 回答
2

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

于 2013-10-18T12:15:17.647 回答
1

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

于 2013-10-18T12:13:47.220 回答
1

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

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

于 2013-10-18T12:14:25.813 回答
1

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

于 2013-10-18T12:14:56.440 回答
1

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

testc-string. 结束c-string标记为\0

test未在问题中发布的程序中明确初始化。test具有不确定的价值,因此您不能期望\0c-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]:创建 T 类型对象的new 表达式按如下方式初始化该对象:

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

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

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

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

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

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


解决方案

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

byte *test = new byte[8]();
于 2013-10-18T13:23:29.583 回答