我在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的字符并且没有null终止,那么我在size-1处的终止可能会将size-4中的垃圾暴露给size-2。但是,我认为大多数标准库或Win32函数都存在问题。
答案 0 :(得分:1)
不,它没有。未初始化的内存位置具有随机内容。 (调试版本可能会进行一些初始化以帮助检测内存损坏,但这在发布版本中不会发生。)
除非您明确地将该内存区域初始化为某个已知值,否则不应依赖任何内存内容。
此question包含有关调试版本的内存初始化的详细信息。 (我不确定列表是否完整。)