前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊一下C编程中变量的初始化

聊一下C编程中变量的初始化

作者头像
Linux兵工厂
发布2023-02-28 13:24:17
8600
发布2023-02-28 13:24:17
举报
文章被收录于专栏:Linux兵工厂

前言

经常有小伙伴在编写程序时因为变量未进行初始化而导致bug的出现。在平时编写程序时你是否在定义变量时有初始化的良好习惯?如果没有,那么你知道不同存储类型的变量默认的初始值是什么吗?如果变量在定义时没有初始化,你是否遇到由此引起的程序bug?那么今天我们来聊一聊在C编程当中变量的初始化。

变量存储类型

C语言当中变量的存储类型总共分为四类:分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)。

  • auto:函数中所有的非静态局部变量都属于自动变量。
  • static:在变量前加上 static 关键字的变量。
  • extern:把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
  • register:一般经常被使用的的变量可以设置成寄存器变量,会被存储在寄存器中,计算速度远快于存在内存中的非 register 变量。

变量初始化与未初始化的区别

  • 测试代码
代码语言:javascript
复制
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int nVar1;
    int nVar2;
    int nVar3;

    printf("nVar1 = %d, nVar2 = %d, nVar3 = %d\n", nVar1, nVar2, nVar3);


    return 0;
}
  • 输出结果
  • 在定义局部变量时如果不进行初始化,那么变量的值是系统随机分配的一个初始值,如果直接拿来使用可能发生未知的错误

真实案例

  • 创建socket返回0的问题

记得之前在做一个FTP上传文件相关的功能时,FTP控制连接和数据连接是自己代码实现的,发现在FTP上传完文件,在其他功能进行调用socket()函数创建socket描述符时,始终返回0.

  • 定位分析问题

经过查找,发现返回0意味着套接字创建成功,说明系统分配了可用的文件描述符为0。但是描述符0是被系统占用的,默认为标准输入,正常情况它应该是被占用的,所以在之前进行FTP相关操作时肯定有程序关闭了描述0,close(0),一旦它关闭,下一次调用函数分配一个文件描述符将返回fd的值为0,因为它是可用的(通过系统调用获取描述符时,系统会从没有占用的最小值开始返回)。按照这个思路查找程序进行全局搜索,果然发现定义静态变量时,功能操作开始时没有进行初始化,而进行清除socket的操作,导致close(0);

不同类型的变量的初始化

  • 全局变量会自动初始化为0,对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。因此尽量不用全局变量
  • 局部变量如果变量是在局部域中定义的,或是通过动态分配的,则系统不会向它提供初始值0,被认为是未初始化,其值随机。
代码语言:javascript
复制
    int *pnVar = NULL;
    int nTest = 0;

    pnVar = malloc(5*sizeof(int));
    if (pnVar)
    {
        memset(pnVar, 0, 5*sizeof(int)); // 要进行初始化
    }
  • 数组可以显示地用一组数初始化
代码语言:javascript
复制
    const int aray_size=3;
    int ia[aray_size]={0,1,2};
    int a[5] ={0};      // 则a的各各元素都初始化为0

    // 如果指定的维数大于给定的元素的个数,没有被显示初始化的元素将置为0。也可以不指定维数值
    int ia[]={0,1,2};

    char buf[10] = {'\0'};

总结

  • 在平时的编程中我们要养成良好的编程习惯,定义变量的同时进行初始化,这样会减少程序出现bug的几率。往往一个小的细节可能会引发一个大的问题。
  • 后续会结合C、C++在定义变量及变量初始化的问题进行详细对比分析
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux兵工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 变量存储类型
      • 变量初始化与未初始化的区别
        • 真实案例
          • 不同类型的变量的初始化
            • 总结
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档