【问题标题】:Does MSVC guarantee a null character in an uninitialized local character array?MSVC 是否保证未初始化的本地字符数组中的空字符?
【发布时间】:2015-08-26 06:33:56
【问题描述】:

我在 Visual Studio 2010 工作,我收到了一个项目,原来的程序员在函数和方法中做了大约一半的时间

    TCHAR some_local_variable[size] = {0};

另外一半的时间,他没有初始化数组:

    TCHAR some_local_variable[size];

我很清楚第一个赋值的作用,但我想知道 MSVC 编译器是否在第二种情况下保证索引 0 处的空字符。 我确实对此进行了测试,第一个字符设置为 0,然后按预期设置为垃圾,但我不确定这是否得到保证?

其次,即使保证了一个空字符(或者如果不是,只需将第一个字符设置为 0),是否有充分的理由用 0 初始化整个数组,尤其是当我总是在之后执行以下操作时任何字符串操作:

    some_local_variable[size-1] = 0;

我唯一的想法是,如果处理字符串的函数没有 null 终止并且复制的字符数小于 size-1,则可能会出现问题。例如,如果它复制了大小为 5 的字符并且没​​有空终止,那么我在大小为 1 的终止可能会将大小为 4 的垃圾暴露给大小为 2。但是,我认为大多数标准库或 Win32 函数都不是问题。

【问题讨论】:

  • 这里的问题是使用了糟糕的 C 数组和神奇的固定大小缓冲区。
  • @Puppy 不幸的是,有时这是必需的。
  • @Paul 不经常。在 C++ 中,您可以使用向量。如果堆分配有问题,您可以使用数组支持的伪向量,或带有花哨的堆栈支持分配器的向量,这样它就在堆栈上达到一定的大小,并且超过了它的堆分配。跨度>
  • @Yakk 可能是这样,但这与这个问题的上下文无关......堆分配的内存也必须初始化。附带说明一下,在很多情况下,固定缓冲区更可取。例如,在这种情况下,字符串大小相对较小,具有已知的最大值,并且通常在 +- 10 个字符内。一个固定的缓冲区是合适的。

标签: c++ visual-studio-2010


【解决方案1】:

不,它没有。未初始化的内存位置具有随机内容。 (调试版本可能会进行一些初始化以帮助检测内存损坏,但在发布版本中不会发生这种情况。)

您不应依赖任何内存内容,除非您将该内存区域显式初始化为某个已知值。

question 包含有关调试版本的内存初始化的详细信息。 (我不确定列表是否完整。)

【讨论】:

  • 我是这么想的,但奇怪的是,即使在 Release 版本中,当我打印出一个未初始化的 TCHAR 数组时,第一个字符总是设置为 0。但是,我肯定不会相信这是有保证的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多