0
点赞
收藏
分享

微信扫一扫

C语言学习踩坑记录(二)

343d85639154 2023-09-16 阅读 18

今天在学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 image.png

原因

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或一个合法的地址。 所以最佳的做法是,全局变量、局部变量和指针在使用前都应该初始化为合理的值,避免读取未定义的内存。

举报

相关推荐

0 条评论