
C语言一维数组分静态一维数组和动态一维数组两种。
一、静态一维数组,在定义的时候就已经确定其长度。如
int a[10];
就是定义了一个长度为10个元素的整型数组。
静态数组不支持长度的增加。如果要增加长度,只能新定义一个更长的数组,并把原始数组的数据复制到新数组中。
二、动态一维数组,本质上是一个一维指针,并在其上分配一段内存,在这段内存上,可以当做数组来使用。
这种情况下,可以通过realloc函数,来实现增加长度。
int p; //定义指针
p = malloc(10sizeof(int));//分配10个元素。
p = realloc(p,20sizeof(int));//重新分配,长度增加到20 使用该函数,可以保持原本空间内的数据不变,只是可用空间增加。
#include <stdioh>
#include <stdlibh>
#define CHUNKSIZE 100
int main()
{
char string;
int i=0,c;
string=malloc(sizeof(char)CHUNKSIZE+1);
if(string==NULL)
{
printf("out of memory");
return 1;
}
while((c=getchar())!=EOF)
{
string[i]=c;
i++;
if(i%CHUNKSIZE==0)
{
string=realloc(string,sizeof(char)CHUNKSIZE(i/CHUNKSIZE+1)+1);
if(string==NULL)
{
printf("out of memory");
return 1;
}
}
}
printf("\n\norgin string is:\n%s\n",string);
free(string);
return 0;
}
输入任意长度字符串,CTRL+D结束输入
输入的数目不定,只是在设计阶段未知,在实际输入的时候,一定是有具体的数量的,所以对于这种情况,需要先做一个约定,常用的有两种方法:1 在输入前,先输入一个总数,然后输入总数个整数。2 约定输入的结束符,如遇到换行结束输入,或者以EOF为结束输入标记。对于每种情况,处理的方式大致相同,但略有区别。1 不需要保存每个值,而是只需要使用该值即可。这样可以读入每个数,逐个处理即可。2 需要保存所有值的,可以将所有值保存在数组中,这个数组可以是静态的,也可以是动态的。如果可以确定数据的最大规模,比如最多1000个数,那么可以先创建一个足够大的,比如1000个元素的数组,静态动态均可。然后依次将元素存入。如果无法确定最大规模,那么就必须用动态数组。对于先输入总数的情况,可以在得到总数后,根据总数申请一个动态数组。对于总数在输入完成前始终未知的情况,可以先申请一定空间的值,在每次空间不足时,使用realloc函数,重新分配空间,实现不定量存储。
数组大小一旦确定就不能改变。
数组长度必须在编译时确定,可以使用malloc函数在程序运行时动态分配所需“数组”长度。定义数组需要指定数组的长度,然后系统会根据这个长度分配固定的内存大小。
当出现intarray[10];这种情况的时候,是不可以变的,这时候变量的存储空间在栈区。当intn;cin>>n;intarray=newint[n];的时候,数组可以根据n输入的大小去分配内存,这时候数组存在堆区。
扩展资料
长度为0的数组在标准C和C++中是不允许的,如果使用长度为0的数组,编译时会产生错误,提示数组长度不能为0。但在GNUC中,这种用法却是合法的。
它的最典型的用法就是位于数组中的最后一项,这样做主要是为了方便内存缓冲区的管理。如果长度为0的数组换为指针,那么在分配内存时,需采用两步:
1、需为结构体分配一块内存空间;
2、再为结构体中的成员变量分配内存空间。这样两次分配的内存是不连续的,需要分别对其进行管理。当使用长度为0的数组时,则是采用一次分配的原则,一次性将所需的内存全部分配给它。相反,释放时也是一样的。
—c语言
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)