c语言如何初始化数组:多种写法对比
c语言如何初始化数组分为显式列表初始化、部分初始化、零初始化、字符串初始化、指定初始化这5种主流写法,定长数组和变长数组支持的方式不一样,C99标准新增指定初始化,变长数组不能在定义时用初始化列表赋值,只能循环逐个赋值,你在VS、GCC编译器下编译时要区分标准版本,C89不支持指定初始化,写嵌入式代码优先用零初始化降低脏数据带来的异常。
c语言数组显式列表初始化
你在数组定义的大括号内依次填入初始值,编译器会按顺序把数值分配给数组对应下标元素,intarr[4]={1,2,3,4};这个写法里数组长度固定为4,4个元素依次赋值。如果大括号内数值数量和数组长度相等,中括号里的数字还可以省略,写成intarr[]={1,2,3,4};,编译器自动统计元素个数确定数组长度,这种写法适合元素数量明确、不需要预留空位的场景。
数值数量少于数组长度时触发部分初始化,未给出初始值的元素自动填充0,intarr[5]={1,2};执行后arr[0]=1,arr[1]=2,arr[2]、arr[3]、arr[4]全部为0。你不要在大括号内写超出数组长度的数值,GCC会抛出编译警告,VS直接编译报错,程序无法生成可执行文件。
c语言数组零初始化
零初始化最常用的写法是intarr[10]={0};,只在大括号写一个0,剩余全部元素自动置0,适合需要清空数组、避免随机垃圾值的场景。memset函数也可以实现批量置0,调用头文件string.h,memset(arr,0,sizeof(arr)),它按字节填充,只在置0时安全可靠,填充非0整数容易出错,int类型占4字节,用memset设置1会得到0x01010101,不是预期的1。
全局数组和静态数组默认初始值就是0。
c语言字符数组与字符串初始化
字符数组支持两种初始化形式,第一种是逐个字符赋值charstr[5]={'a','b','c','d','\0'};,手动添加字符串结束符;第二种直接用双引号字符串charstr[5]="abcd";,编译器自动在末尾追加'\0'。字符串长度不能超过数组容量减1,要预留一个位置存放结束符,charstr[4]="abcd";会丢失结束符,后续用printf输出字符串会出现乱码。
c语言指定初始化与变长数组初始化
| 初始化方式 | 支持标准 | 适用数组类型 | 核心特点 |
|---|---|---|---|
| 指定初始化 | C99及以后 | 定长数组 | 按下标赋值,其余元素置0 |
| 初始化列表 | C89、C99 | 定长数组 | 顺序赋值,写法直观 |
| 循环赋值 | 全部C标准 | 定长、变长数组 | 运行时赋值,灵活度高 |
| memset置0 | 全部C标准 | 定长数组 | 批量置0,不能直接赋非0整数 |
指定初始化语法为intarr[10]={[2]=5,[7]=9};,下标2赋值5,下标7赋值9,剩下所有元素自动填0,不需要按顺序罗列全部值,配置稀疏数组时效率更高。变长数组是C99引入的特性,长度由变量决定,定义时不能搭配大括号初始化列表,你只能在定义完成后用for循环遍历下标逐个赋值,intn=5;intarr[n];for(inti=0;i
局部自动数组不初始化时,元素值是栈内存里遗留的随机脏数据,每次运行数值可能不一样,读取这类未初始化元素属于未定义行为。
该方法的适用边界是,C89老编译器不识别指定初始化语法,一些老旧单片机编译器只兼容C89,写这类项目代码时要放弃指定初始化,改用顺序初始化列表或者循环赋值。
二维数组初始化可以嵌套大括号,intarr[2][3]={{1,2,3},{4,5,6}};,内层大括号对应每一行,也可以扁平化写成intarr[2][3]={1,2,3,4,5,6};,编译器先行填满第一行,再填充第二行,部分初始化时同样遵循未赋值元素自动补0的规则。
