当我遇到这个旧的post时,我最近参加了The Daily WTF。在其中,作者提到其中一位程序员改变了这段代码:
int main (int argc, char **argv)
{
int x;
char data_string[15];
...
x = 2;
strcpy(data_string,"data data data");
...
}
到此代码:
int main (int argc, char **argv)
{
int x = 2;
char data_string[15] = "data data data";
...
}
作者接着提到:
[编码器]改变了要在堆栈上启动的每个变量
对于我的生活,我看不出这种变化是如何有害的,我担心这是我的C知识的失效。什么是WTF?
答案 0 :(得分:3)
我认为堆栈初始化不是问题所在。他原本应该寻找难以发现的内存泄漏,但他决定在数千个C文件上进行初始化更改。
虽然,mentioned on wikipedia,“未初始化的变量[是]常见的错误原因”。如果您在声明时处理它,则可以消除使用未初始化变量的可能性。但是,将这种转换为几千个文件可能不是找到并解决实际问题的最有效方法。
答案 1 :(得分:0)
我认为新代码更好。除了我会离开
char data_string[] = "data data data";
答案 2 :(得分:0)
更糟糕的唯一方法是旧代码可能永远不会在某些代码路径中初始化(或使用)该值。
另一个问题是这个
char data_string[99] = "data data data";
将初始化99个字符而不仅仅是前15个字符。这就是
char data_strings[99] = "";
比这个贵很多
char data_strings[99];
data_strings[0] = 0;
当然,如果缓冲区真的只需要足够大以容纳“数据数据”, 那就更好了
char data_string[] = "data data data";
但这让你想知道是否有必要将字符串复制到堆栈变量中。