问题: 局部变量被初始化为零,但是如果将变量分配给指针,则它不会被初始化为零。
代码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,但结果是相同的。
答案 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
)变量的自动初始化。
您的选择:
static
(甚至将其移出函数体),然后在程序启动时将它们初始化为0(或NULL)。memset(&structure, 0, sizeof structure);
确实没有解决未定义行为的方法,因为其他人已经提到过。您必须避免使用它(为此,您需要了解触发它的原因,它要比未初始化的变量多得多)。