未初始化的变量 - 将其传递给函数

时间:2016-03-08 12:13:00

标签: c++ initializer

http://en.cppreference.com/w/cpp/language/storage_duration

  

静态局部变量

     

在块范围内声明的静态变量首先被初始化   时间控制通过他们的声明(除非他们的   初始化是零或常量初始化,可以是   在首次输入块之前执行)。在所有进一步的电话,   声明被跳过。

'静态'是什么意思?在这句话中?是吗:

  

静态存储持续时间。在何时分配对象的存储空间   程序结束时程序开始并解除分配。

如果是这样,那么它并没有解释int k;main或其他任何函数在初始化方面会发生什么,因为k不是静态变量(当程序开始时它没有被分配,并且在程序结束时被释放 - 等待一秒,你可以说main函数在程序开始时开始运行并在程序结束时返回,但是&# 39;不是它的工作原理我想。)

在主要功能中:

int k;
k++;

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

因此,如果上面的k不是静态局部变量,您能举例说明这些变量吗?

有人可以告诉我为什么以下代码编译并运行没有任何问题,即使k未初始化?

给定一个没有身体的功能:

void foo(int* number) { }

main中调用它:

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

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

3 个答案:

答案 0 :(得分:0)

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

编辑:我对此在线编辑器的行为不同:http://cpp.sh/9axqz 但是一旦我对函数中的数字执行某些操作,编译警告就会消失。

答案 1 :(得分:0)

静态局部变量是这样的:

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,可能值得一读。

答案 2 :(得分:0)

静态变量可以这样定义:

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

因此,当您第一次调用此函数时,静态变量index将使用-1;进行初始化。下一行将index增加1并返回结果。

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

如果没有实现不同,静态varibales也会自动初始化为零。

因此,如果您将上述功能更改为

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

它返回的第一个值是1。此外,第一个调用不会初始化index,但会在程序启动后立即初始化。