今天在学C语言的循环语句,目标是想计算从1+2+3+...+100的结果。 具体程序如下:
#include <stdio.h>
void fun1();
void fun2();
int main()
{
fun1();
fun2();
return 0;
}
void fun2()
{
int i, total;
for (i = 1; i <= 100; i++)
{
total += i;
}
printf("%d\n", total);
}
void fun1()
{
int i = 1, total = 0;
while (i <= 100)
{
total += i;
i++;
}
printf("%d\n", total);
}
但是输出结果不符合预期,本应该输出两个5050,但是第二个循环却输出了10100
原因
fun2() 函数中没有对 total 进行初始化,导致 total 变量的初始值是未定义的,所以输出结果为 10100。
好奇
既然没有初始化值,那么它是怎么样让它的初始值是5050的呢?
解答
c语言中未初始化的变量是不确定的值,读取时会返回一个未定义的随机值。 具体来说,在c语言中,未初始化的全局变量和静态变量会默认初始化为0。而未初始化的局部变量的值是不确定的,读取时会返回一个随机的垃圾值。 例如:
int a; // 全局变量a默认初始化为0
void func() {
int b; // 局部变量b的值是不确定的
printf("%d\n", a); // 打印0
printf("%d\n", b); // 打印一个随机垃圾值
}
总结
读取未初始化的局部变量会导致未定义的行为,应该避免这样做。要使用局部变量,必须先赋一个合理的初始值。 未初始化的指针也很危险,可能导致程序崩溃或执行非预期的代码。应该总是初始化指针为NULL或一个合法的地址。 所以最佳的做法是,全局变量、局部变量和指针在使用前都应该初始化为合理的值,避免读取未定义的内存。