为什么变量以C中的随机值开始

时间:2010-12-14 00:53:11

标签: c variables random declaration default-value

我认为这是错误的,它应该从NULL开始,而不是随机值。如果你的指针有一个随机存储器地址作为默认值,那么这可能是一件非常危险的事情,不是吗?

7 个答案:

答案 0 :(得分:5)

变量从未初始化开始,因为这是最快的方式 - 如果你打算在那里写另一个值,为什么要浪费CPU周期初始化?

如果要在创建后初始化变量,只需将其初始化即可。 :)

关于它是一个危险的事情:如果你试图在没有初始化的情况下使用变量,每个好的编译器都会发出警告。

答案 1 :(得分:3)

没有。 C是一种非常有效的语言,传统上它比许多其他语言更快。其中一个原因是它本身并没有做太多。程序员控制它。

在初始化的情况下,C变量不会初始化为随机值。相反,它们没有被初始化,因此它们包含之前在内存位置的任何内容。

如果你想在程序中初始化一个变量,比如1,那么如果变量已经初始化为零或为零,则效率很低。这意味着它被初始化了两次。

答案 2 :(得分:2)

执行速度和开销(或缺乏开销)是主要原因。 C因为它总是假设用户比它更了解而臭名昭着。

请注意,如果您将变量声明为static,则实际 保证初始化为0。

答案 3 :(得分:1)

变量以随机值开始,因为你只是交了一块内存并告诉你自己处理它。它具有记忆块之前具有的任何价值。当你可能稍后自己设置时,为什么程序会浪费时间将值设置为某个任意默认值?

答案 4 :(得分:1)

设计选择是性能,这也是C不是大多数项目首选语言的众多原因之一。

答案 5 :(得分:1)

这与“如果今天正在设计C”或一次初始化的效率无关。想想像

这样的东西
void foo()
{
    struct bar *ptrs[10000];
    /* do something where only a few indices end up actually getting used */
}

任何强制对你进行无用初始化的语言都注定要慢,因为对于那些可以使用稀疏数组的算法来说你不关心大多数值,并且有一种简单的方法可以知道你是哪个值关心。

如果您不喜欢我在堆栈中包含如此大对象的示例,请替换malloc。它在初始化方面具有相同的语义。

在任何一种情况下,如果您想要零初始化,可以使用{0}calloc获取。

答案 6 :(得分:0)

这可能是出于效率原因而在很多人面前做出的设计选择。

如果没有明确的初始化,静态分配的变量(全局和静态)被初始化为0 - 即使考虑到效率也可以证明这是合理的,因为它只发生一次。我猜想,对于每次输入作用域时分配的自动变量(locals),隐式初始化被认为可能花费太多,因此应由程序员负责。

如果今天设计了C,如果设计决定改变了,我也不会感到惊讶 - 特别是因为编译器今天足够智能,能够优化掉在任何其他用途(或潜在用途)之前被覆盖的初始化

然而,有很多C编译器工具链遵循不自动初始化的规范,编译器对“有用”值(如0或NULL)执行隐式初始化是愚蠢的。这只会鼓励那些针对该工具链的人编写在其他工具链上无法正常工作的代码。

但是,编译器可以初始化局部变量,而且他们经常这样做。只是他们将locals初始化为一般不常用的值(特别是,它没有设置指向空指针的指针)。这种初始化在编写编程逻辑时没有用,并不是为了这个目的。它旨在导致确定性和可重现的错误,这样如果您错误地使用通过隐式初始化设置的值,您将能够在测试/调试中轻松找到它。

通常,此编译器行为仅针对调试版本打开;我可以看到在发布版本中打开它的论点 - 特别是当编译器可以证明从不使用隐式初始化值时,发布版本仍然可以优化它。