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的规则。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于c语言如何初始化数组的文章欢迎访问:百科