未初始化的变量 - 它传递给一个函数

问题描述:

http://en.cppreference.com/w/cpp/language/storage_duration未初始化的变量 - 它传递给一个函数

Static local variables

Static variables declared at block scope are initialized the first time control passes through their declaration (unless their initialization is zero- or constant-initialization, which can be performed before the block is first entered). On all further calls, the declaration is skipped.

什么是“静态”在这句话的含义?它是:

static storage duration. The storage for the object is allocated when the program begins and deallocated when the program ends.

如果是这样的话,那并不能说明什么,在初始化方面main或任何其他功能发生int k;,因为k不是一个静态变量(它不会分配时程序结束时程序开始并解除分配 - 等待一秒钟,您可能会说程序开始时main函数开始运行,程序结束时返回,但这不是我想到的)。

在主函数:

int k; 
k++; 

导致错误:uninitialized local variable 'k' used

因此,如果k以上不是一个静态局部变量,你能举一个这样的变量的例子吗?

谁能告诉我为什么下面的代码编译和运行没有任何问题,即使k未初始化?

由于没有身体的功能:

void foo(int* number) { } 

,并要求它像这样在main

int k;  
foo(&k); 
k++; 

现在编译并没有问题运行,但k值为-858993459 。编译器不喜欢我试图在没有启动的情况下增加它,但将它传递给foo导致编译器忘记了它。为什么?

+0

下流者,小心解释原因? – user5539357

+0

一个程序在调用'main'之前开始,在'main'返回之后结束。局部变量具有自动存储持续时间,除非您使用'static'指定静态持续时间,例如'static int k;' – molbdnilo

可能取决于您的编译器实现。 我猜编译器会发现你的变量是以非const方式传递给函数的,所以函数可能会修改/初始化k的值。 您的编译器不会深入该函数来推断逻辑,因此它可让您编译代码。

编辑:我没有得到与这个在线compier相同的行为:http://cpp.sh/9axqz 但编译警告消失,只要我做了一些与函数中的数字。

+0

在Visual Studio中,我不会发出警告,而是编译错误。传递给foo后,它消失。 – user5539357

静态局部变量是这样的:

void example() { 
    static int i = 0; // a static local variable 
    int j = 0; // not static 
    // ... 
} 

内建类型,例如int不会自动初始化。因此,当您将该变量设置为有意义的内容之前尝试读取该变量时,可能会可能会,因为它可以容纳任何东西。

仅仅因为你的特定编译器不再给你一个警告并不意味着你的变量被正确初始化。作为一个经验法则,你应该始终明确地初始化变量,以避免意外从中读取,而不必首先将其设置:

int i; // not initialized 
int j = 0; // explicitly set to 0 

这里是C++的核心准则的链接初始化的话题:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es20-always-initialize-an-object,它可能值得一读。

+0

我对这篇文章中的静态含义感到困惑。不知何故,我认为他们在那里使用了静态变量的不同含义,尤其是静态存储已在前一段中进行了解释...... – user5539357

静态变量可以被定义如下:

int nextIndex() 
{ 
    static int index = -1; 
    return ++index; 
} 

所以,当你第一次调用这个函数的静态变量index-1;被初始化。下一行将增加index1并返回结果。

所有后续调用nextIndex将只执行return ++index;部分并跳过初始化。

此外,静态varibales会自动初始化为零,如果未实现不同的话。

所以,如果你上面的函数改为

int nextIndex() 
{ 
    static int index; 
    return ++index; 
} 

它返回的第一个值将是一个。第一次调用也不会初始化index,但是一旦程序启动,它就会被初始化。