動態(tài)分配的數組可以自定義數組的長度,示例如下:
10余年的海口網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整??诮ㄕ镜娘@示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯從事“海口網站設計”,“??诰W站推廣”以來,每個客戶項目都認真落實執(zhí)行。
#include?stdio.h
#include?string.h
#include?stdlib.h
int?main()
{
printf("輸入要分配的內存大小:");
int?size;
scanf("%d",?size);??//輸入自定義的數組長度
int?*pstart?=?(int?*)malloc(sizeof(int)?*size);
if?(pstart==0)?{
printf("不能分配內存\n");
return?0;
}
memset(pstart,?0x00,?sizeof(int)?*?size);
int?inx;
for?(inx=0;?inx!=size;?++inx)?pstart[inx]?=?inx;
for?(inx=0;?inx!=size;?++inx)?printf("%d\t",?pstart[inx]);
printf("\n");
return?0;
}
定義數組時在中括號內寫上代表長度的數字,定義一維數組和二維數組是一樣的。
注意長度是直接用數字大小來代表,而索引時是從0開始算的!
例如:
#includestdio.h
main(){
int a[5];//定義一個長度為5的一維數組a
int b[5][6];//定義一個5行6列的二維數組b
}
在定義數組時可以不定義長度,可以由編譯器來決定,只要在定義時賦值就可以了,這時括號內可以不寫數值。
例如:
#includestdio.h
main(){
int a[] = {0,1,2,3,4};//定義一個長度為5的數組,內容為0,1,2,3,4
}
C語言支持定義一個不顯式定義長度的數組,即通過初始化數據來分配數組長度。
比如int a[] = {1,2,3,4,5}; 數組a的長度沒有顯式給出,由于有5個初始化數據,所以分配空間長度為5個int型。
但是無論如何定義,數組的長度都是固定的,在定義的時候就已經分配好空間,從這個角度上C語言無法定義無限長的數組。但很多實際應用中又事先無法確定數組的長度,對于這類情況,一般有兩種方法可以使用。
1 由malloc和realloc兩個函數,分配動態(tài)空間,隨時按需改變數組的最大長度。
通過下面例子來理解該方法:
#include?stdio.h
#include?stdlib.h
int?main()
{
int?size=100;//最初為100個元素空間。
int?*a?=?NULL;
int?i?=?0;
a?=?malloc(sizeof(int)?*?size);
if(a?==?NULL)?return?-1;
while(scanf("%d",?a+i)?==?1)//循環(huán)向a中輸入數據,直到輸入非數值字符為止
{
i++;
if(i?==?size)//數組空間不足
{
size?*=2;?//將數組空間擴大二倍,?也可以改用size+=100;之類的操作,使size每次增加固定值。
a=realloc(a,size);//分配新的空間
if(a==NULL)
{
return?-1;//這種情況下運行載體(如PC)內存不足以提供,中斷程序。
}
}
}
if(a)?free(a);//對申請的內存進行釋放。
return?0;
}
從以上程序可以看到,這種方式的原理就是每當數組空間不足時,利用函數realloc分配一段新的內存空間以增大數組長度。 直到占滿所有剩余空間。
如果到占滿所有空間還是無法存下數據,那么是硬件無法支持了。
所以這種方法可以做到軟件意義上的無限大數組空間。
但是這種方法代碼量比較大,而且需要頻繁的進行內存的分配,如果實現知道數據的最大可能規(guī)模,那么可以用另一個方法。
2 事先知道數據的最大規(guī)模,比如統計一個班的分數時,一個班最多不超過百人,那么可以直接定義一個長度為100的數組,或者保險起見,定義一個長度為1000的數組,并對其操作。這樣在操作范圍內,這個就是一個“無限長”的數組了。
1、c語言中,定義數組后可以用sizeof命令獲得數組的長度(可容納元素個數)。
例如:
double a[] = {1,2,3,4};
int length;
length=sizeof(a)/sizeof(a[0]); //數組占內存總空間,除以單個元素占內存空間大小
printf(“l(fā)ength of a=%d”, length ); //輸出length of a=4
2、但是,通過傳遞數組名參數到子函數中,以獲得數組長度是不可行的。
例如:
int getLength(int a[]){
int length;
length=sizeof(a)/sizeof(a[0]); //這樣是錯誤的,得到的結果永遠是1
return length;
}
因為,a是函數參數,到了本函數中,a只是一個指針(地址,系統在本函數運行時,是不知道a所表示的地址有多大的數據存儲空間,這里只是告訴函數:一個數據存儲空間首地址),所以,sizoef(a)的結果是指針變量a占內存的大小,一般在32位機上是4個字節(jié)。a[0]是int類型,sizeof(a[0])也是4個字節(jié),所以,結果永遠是1。
3、因此,獲得數組長度,只能在數組定義所在的代碼區(qū)中,采用以上方法,才可以達到效果