MSVC是否保证在未初始化的本地字符数组中为空字符?

Does MSVC guarantee a null character in an uninitialized local character array?

本文关键字:字符 数组 是否 初始化 MSVC      更新时间:2023-10-16

我在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,可能会出现问题。例如,如果它复制了size-5的字符并且没有null终止,那么我在size-1处的终止可能会将size-4的垃圾暴露给size-2。然而,我不认为这是大多数标准库或Win32函数的问题。

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

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

这个问题有关于调试构建的内存初始化的详细信息。(我不确定清单是否完整。)