【发布时间】: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 个字符内。一个固定的缓冲区是合适的。