自动初始化C中的局部变量

时间:2019-01-06 09:42:18

标签: c

问题: 局部变量被初始化为零,但是如果将变量分配给指针,则它不会被初始化为零。

代码1:局部变量被初始化为零(我已经测试过,可能总是将a始终设置为零)

int main() {
    int a;
    printf ("a = %d\n",a);
    return 0;
}

OUTPUT:
a = 0 ( I have called this about a 100 times, and 'a' is always zero)

代码2:局部变量未初始化为零(我已经测试过,可能永远不会将a设置为零)

int main() {
    int a;
    printf ("a = %d\n",a);
    nt *b = &a;
    printf("*b = %d\n",*b);
    return 0;
}

OUTPUT:
a = 21683 (everytime I run, I get different values as expected)
*b = 21683

我希望a具有随机值,因为它不是静态变量。谁能知道为什么会这样?这是编译器的标准功能还是某些功能。

PS:我正在使用gcc。

我尝试了不同的优化选项,甚至是-o0,但结果是相同的。

2 个答案:

答案 0 :(得分:3)

该行为是完全不可预测的。在这种情况下,零和其他垃圾一样多。顺便说一句,我碰巧得到了不同的结果:

$ cat a.c
#include <stdio.h>

void f1() {
    int a;
    printf ("f1: a = %d\n",a);
}

void f2() {
    int a;
    printf ("f2: a = %d\n",a);
    int *b = &a;
    printf("f2: *b = %d\n",*b);
}

int main()
{
    f1();
    f2();
}

$ gcc a.c -O2 -o a
$ ./a
f1: a = 0
f2: a = 0
f2: *b = 0

$ gcc a.c -o a
$ ./a
f1: a = 22011
f2: a = 22011
f2: *b = 22011

答案 1 :(得分:0)

C中没有automatic(在您看来是local)变量的自动初始化。

您的选择:

  1. 不要使用C(甚至C ++也可能不存在,因为它有类似的问题)
  2. 根据需要初始化它们中的每一个
  3. 如果代码的结构和逻辑允许,请将其设置为static(甚至将其移出函数体),然后在程序启动时将它们初始化为0(或NULL)。
  4. 定义一个包含所有这些变量的结构,然后对其进行memset(&structure, 0, sizeof structure);

确实没有解决未定义行为的方法,因为其他人已经提到过。您必须避免使用它(为此,您需要了解触发它的原因,它要比未初始化的变量多得多)。