C語言如何實現(xiàn)動態(tài)數(shù)組?
關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容
來源:技術(shù)讓夢想更偉大
作者:李肖遙
提出問題
請問在c語言里如何實現(xiàn)動態(tài)大小的數(shù)組啊,比如說int a[N];,這里N的值可以在程序中定,或者有什么方法可以實現(xiàn)類似的功能?總之只要在編譯時不用制定數(shù)組大小就行。
分析問題
嵌入式系統(tǒng)的內(nèi)存是寶貴的,內(nèi)存是否高效率的使用,往往意味著嵌入式設(shè)備的高質(zhì)量和高性能,有時我們所需的內(nèi)存空間無法預(yù)先確定,這里使用靜態(tài)數(shù)組的辦法很難解決,所以高效的使用內(nèi)存對我們來說是很重要的。
所以我們在自己編寫C語言代碼的時候,就應(yīng)該學(xué)會使用動態(tài)數(shù)組,那么怎么實現(xiàn)呢?
靜態(tài)數(shù)組與動態(tài)數(shù)組的區(qū)別
對于靜態(tài)數(shù)組,一旦定義了,數(shù)組長度也就指定好了,系統(tǒng)將為它分配一個固定大小的空間,使用完無需釋放,引用簡單,但是創(chuàng)建后無法改變其大小,這在應(yīng)用中是一個致命弱點!
對于動態(tài)數(shù)組,它可以隨程序需要而重新指定大小,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則將會引起內(nèi)存泄露。但其使用非常靈活,能根據(jù)程序需要動態(tài)分配大小。所以相對于靜態(tài)數(shù)組的來說我們對于使用動態(tài)數(shù)組有很大的自由度。
動態(tài)數(shù)組的內(nèi)存空間是從堆上分配的,通過執(zhí)行代碼而為其分配存儲空間。當(dāng)程序執(zhí)行到這些語句時,才為其分配,程序員自己負(fù)責(zé)釋放內(nèi)存。
在創(chuàng)建動態(tài)數(shù)組的過程中要遵循以下原則:
在創(chuàng)建的時候從外層往里層,逐層創(chuàng)建;
在釋放的時候從里層往外層,逐層釋放。
如何創(chuàng)建動態(tài)數(shù)組?
下面是一個創(chuàng)建動態(tài)數(shù)組的例子,按照需求設(shè)置數(shù)組大小:
#include <stdio.h>
#include <stdlib.h>
int main(){
int arrLen;
int *array;
int i;
printf("please enter length:");
scanf_s("%d", &arrLen);
array = (int*)malloc( arrLen*sizeof(int) );
if(!array){
printf("create error!\n");
exit(1);
}
for(i=0; i<arrLen; i++){
array[i] = i+1;
}
for(i=0; i<arrLen; i++){
printf("%d ", array[i]);
}
printf("\n");
free(array);
system("pause");
return 0;
}
運行結(jié)果:

使用內(nèi)存中的數(shù)據(jù)
上面的代碼中,我們通過下標(biāo)array[i]來引用數(shù)組元素,這個靜態(tài)數(shù)組沒有什么區(qū)別。另外還可以通過指針來引用數(shù)組元素,對上面的程序稍作修改:
#include <stdio.h>
#include <stdlib.h>
int main(){
int arrLen;
int *array;
int *arrayCopy;//用來指向具體的數(shù)組元素
int i;
printf("please enter length:");
scanf_s("%d", &arrLen);
arrayCopy = array = (int*)malloc( arrLen*sizeof(int) );
if(!array){
printf("create error!\n");
exit(1);
}
for(i=0; i<arrLen; i++){
*arrayCopy++ = i+1;
}
arrayCopy = array;//重置到數(shù)組首地址
for(i=0; i<arrLen; i++){
printf("%d ", *arrayCopy++);
}
printf("\n");
free(array);
system("pause");
return 0;
}
需要注意的是,free() 函數(shù)必須釋放整塊內(nèi)存,多定義一個變量 arrayCopy,不斷改變它的值,以指向不同的數(shù)組元素。這樣可以保證 array 變量的值不變,始終指向內(nèi)存首地址,用于free()整塊內(nèi)存。
當(dāng)然也可以動態(tài)創(chuàng)建多維數(shù)組,其原理都是一樣的,并且需要遵循創(chuàng)建與釋放的原則。
嵌入式編程專輯 Linux 學(xué)習(xí)專輯 C/C++編程專輯 Qt進階學(xué)習(xí)專輯
關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
這是我另一個技術(shù)號,程序員的編程學(xué)習(xí)基地,注重編程思想,歡迎關(guān)注!
點擊“閱讀原文”查看更多分享。
