2010-02-12 71 views
4

我最近在The Daily WTF上遇到这个旧的post。在它的作者提到,程序员之一改变了这种代码:无法找到问题

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"; 
    ... 
} 

笔者接着提到:

[编码器]更改每个变量在堆栈上启动

对于我的生活我ca没有看到这种变化可能是有害的,我担心这是我的C知识中的失误。什么是WTF?

+0

当亚历克斯从一口大小的代码块中移开,每次都写完整篇文章时,DailyWTF完全跳出了鲨鱼。 – 2010-02-12 01:57:53

+1

如果你看看WTF中的评论,你会发现没有人可以看到这个问题 – pm100 2010-02-12 02:01:38

+1

当你看到1000多个文件改变了,为了做到这一点,没有有意义的源代码控制评论,它就成了我书中的WTF。 – 2010-02-12 02:08:07

回答

3

我不认为栈初始化是问题。他应该在寻找难以发现的内存泄漏,但他决定在数千个C文件上进行初始化更改。

虽然,如mentioned on wikipedia,“未初始化的变量[是]错误的常见原因”。如果您在声明中处理它,可以消除使用未初始化变量的可能性。但是,转换成几千个文件可能不是找到和解决实际问题的最有效方式。

+0

其实我认为这是为了防止null - 指针用法可以是(或取决于环境/操作系统)更隐蔽。栈初始化有助于编译器优化,使代码更快。根据代码复杂性的不同,在第一个例子中,x的赋值可能不会在分配时完成,因为您只能保证在第二个示例/已更改的代码中是这种情况。 – 2010-02-12 02:11:33

+1

它发生,有时你只是举起你的手,并修复所有可能是问题的东西。 – 2010-02-12 02:12:18

0

我认为新代码更好。除了我会去

char data_string[] = "data data data"; 
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"; 

但是,让你不知道它是否是以往任何时候都需要将字符串复制到堆栈变量都没有。

相关问题