数组的初始化
c语言的数组初始化分为2种情况
第一种情况是在数组的初始化的时候,并没有明确给出数组的长度,而是通过赋初值的方法,由系统进行数组的长度计算。
char a[]={'1','2','3'},b[]="123";
printf("%d,%d\n",sizeof(a),sizeof(b));
所得到的输出结果为3,4。
char a[]={'1','2','3'},b[]="123";
printf("%d,%d\n",strlen(a),strlen(b));
使用相同数组定义,不同的函数去进行测量,所得到的输出结果为35,3.
有意思的是,数组的定义是相同的,但是输出的结果却大不相同,尤其是关于数组a的长度。
在sizeof()函数中,所得到得结果为3,而在strlen()函数中,得到得结果为35,显然后者所测量得数据偏差很多。
查询可得,sizeof()得运行规则是根据系统所分配得空间得大小。
strlen()函数得运行规则是以终止符’\0‘,为终点,并且不包含终止符在内。
而数组的长度是包含终止符在内的
总结:a,b数组的真实长度为3,4.
其中的原因在于如果数组b这样的初始化,系统将在末尾自动分配一个终止符’\0’
数组a形式的初始化,则不会分配终止符,如果强制使用strlen()函数,编译器 不会报错,但是所得的数组长度将会出现远远超越真实长度的数值。
第二种情况,数组初始化的时候,给出了数组的真实长度
char a[3]={'1','2','3'},b[3]="123";
printf("%d,%d\n",sizeof(a),sizeof(b));
运行代码可知结果为a的长度为3,而b的运行报错。
报错原因是"b"数组界限溢出,这是因为在数组b进行初始化的时候,所给出的数组长度为3,但是进行这样的赋值的时候,系统依旧会在字符串的末尾加上终止符,实际的数据长度为4,超出给定的范围,产生溢出。
char a[10]={'1','2','3'},b[6]="123";
printf("%d,%d\n",sizeof(a),sizeof(b));
输出结果为10,6
char a[10] = { '1','2','3' }, b[6] = "123";
printf("%d,%d\n", strlen(a),strlen(b));
输出的结果为3,3
其中的原因在于,虽然我们让系统给数组a分配了长为10的空间,但是由于初始化的值只能占用3位,其余7位全为系统默认添加的终止符。数组b同理。
综上所述,数组的长度并不是所给定的赋值的位数,而是实际所占用资源的位数,并且使用strlen()区间去进行测量的时候,所得的绝对不能当做真实的数组长度
补充:由于数组的真实长度是最开始由系统所分配的,所以必须是一个确定值,即常数。
运行以下代码,则将报错。
char n = 5,a[n]