C语言不支持不定长数组,要么malloc,要么在动态的指定它的长度
动态数组不能初始化,可使用memset
1.int* p = (int*)malloc(num);
2.int num = 5;
arr[num];
若使用arr[],则需要在后面对齐进行初始化,来指定长度,否则编译可以通过,但是默认只有一个单元,超过一个单元的长度,在后面程序的运行中有可能会被冲掉
1
|
int arr[] = {0}; //定义了一个单元的数组,并不是不定长数组 |
最好不用使用arr[] = {0}来定义数组,定义数组之前应要指定长度
1
|
int arr[256] = {0}; |
int a[256]={0};并不是把a的所有元素初始化为0,int a[256]={1};也不是把a所有的元素初始化为1.
数组可以用一个列值来初始化,例如
1
2
|
int v1[] ={1,2,3,4}; char v2[]={ 'a' , 'b' , 'c' ,0}; |
当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
1
2
|
char v3[2] ={ 'a' , 'b' ,0}; //错误:太多的初始化值了 char v3[3] ={ 'a' , 'b' ,0}; //正确 |
如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为 0。
例如
1
|
int v5[8]={1,2,3,4}; |
等价于
1
|
int v5[8]={1,2,3,4,0,0,0,0}; |
注意没有如下形式的数组赋值:
1
2
3
4
|
void f() { v4={ 'c' , 'd' ,0}; //错误:不是数组赋值 } |
顾名思义,集合(aggregate)就是多个事物聚集在一起,这个定义包括混合类型的集合:像struct和class等,数组就是单一类型的集合。
初始化集合往往既冗长又容易出错,而C++中集合初始化(aggregate initialization)却变得很方便而且很安全。当产生一个集合对象时,要做的只是指定初始值就行了,然后初始化工作就由编译器去承担了。这种指定可以用几种不同的风格,它取决于正在处理的集合类型。但不管是哪种情况,指定的初值都要用大括号括起来。
比如一个内部类型的数组可以这样定义:
1
|
int a[5] = { 1, 2, 3, 4, 5 }; |
如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初始化少于数据元素的个数,那将会怎么样呢?
例如:
1
|
int b[6] = {0}; |
这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果定义了一个数组而没有给出一列初始值时,编译器并不会去做初始化工作。所以上面的表达式是将一个数组初始化为零的简洁方法。
以上这篇C语言不定长数组及初始化方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/wanghao19920907/article/details/51787927