C語言 動態(tài)分配數(shù)組案例詳解
很多人在編寫C語言代碼的時候很少使用動態(tài)數(shù)組,不管什么情況下通通使用靜態(tài)數(shù)組的方法來解決,在當初學(xué)習C語言的時候我就是一個典型的例子,但是現(xiàn)在發(fā)現(xiàn)這是一個相當不好的習慣,甚至可能導(dǎo)致編寫的程序出現(xiàn)一些致命的錯誤。尤其對于搞嵌入式的人來所,嵌入式系統(tǒng)的內(nèi)存是寶貴的,內(nèi)存是否高效率的使用往往意味著嵌入式設(shè)備是否高質(zhì)量和高性能,所以高效的使用內(nèi)存對我們來說是很重要的。那么我們在自己編寫C語言代碼的時候就應(yīng)該學(xué)會使用動態(tài)數(shù)組,這也就是我這篇博客要給大家講的,我盡我所能的用一些簡單的代碼來講解動態(tài)數(shù)組,希望我所講的對你有所幫助。
那么我們首先來看看什么是動態(tài)數(shù)組,動態(tài)數(shù)組是相對于靜態(tài)數(shù)組而言,從“動”字我們也可以看出它的靈活性,靜態(tài)數(shù)組的長度是預(yù)先定義好的,在整個程序中,一旦給定大小后就無法改變。而動態(tài)數(shù)組則不然,它可以隨程序需要而重新指定大小。動態(tài)數(shù)組的內(nèi)存空間是從堆動態(tài)分配的。是通過執(zhí)行代碼而為其分配存儲空間。當程序執(zhí)行到我們編寫的分配語句時,才為其分配。對于靜態(tài)數(shù)組,其創(chuàng)建非常方便,使用完也無需釋放,要引用也簡單,但是創(chuàng)建后無法改變其大小是其致命弱點!對于動態(tài)數(shù)組,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則將會引起內(nèi)存泄露。但其使用非常靈活,能根據(jù)程序需要動態(tài)分配大小。所以相對于靜態(tài)數(shù)組的來說我們對于使用動態(tài)數(shù)組有很大的自由度。
在創(chuàng)建動態(tài)數(shù)組的過程中我們要遵循一個原則,那就是在創(chuàng)建的時候從外層往里層,逐層創(chuàng)建;而釋放的時候從里層往外層,逐層釋放。這個話你讀了可能理解并不深刻,不過不要急,接下來我們看看兩段代碼。
一維動態(tài)數(shù)組的創(chuàng)建:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1,i;
int *array;
printf("請輸入所要創(chuàng)建的一維動態(tài)數(shù)組的長度:");
scanf("%d",&n1);
array=(int*)calloc(n1,sizeof(int));
for(i=0;i<n1;i++)
{
printf("%d\t",array[i]);
}
printf("\n");
for(i=0;i<n1;i++)
{
array[i]=i+1;
printf("%d\t",array[i]);
}
free(array);//釋放第一維指針
return 0;
}
運行結(jié)果為:

二維數(shù)組的創(chuàng)建:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int num1,num2;
cout<<"請輸入動態(tài)二維數(shù)組的第一個維度:";
cin>>num1;
cout<<"請輸入動態(tài)二維數(shù)組的第二個維度:";
cin>>num2;
int **array = (int **)calloc(num1,sizeof(int));
for(int i=0;i<num1;i++) {
array[i] = (int*)calloc(num2,sizeof(int));
}
for(int i=0;i<num1;i++){
for(int j=0;j<num2;j++){
array[i][j] =i*num2+j+1;
printf("%d\t",array[i][j]);
}
cout<<endl;
}
for(int i=0;i<num1;i++) free(array[i]);
free(array);
return 0;
}
運行結(jié)果為:

請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:3
請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:3
1 2 3
4 5 6
7 8 9
Press any key to continue
有了上面的代碼我們再來說動態(tài)數(shù)組的建立就簡單了,以二維為例,先說創(chuàng)建,還記得我們上面說的創(chuàng)建的原則嘛:從外層往里層,逐層創(chuàng)建。
array=(int**)malloc(n1*sizeof(int*)); //第一維
以上是我們創(chuàng)建二維動態(tài)數(shù)組的最外層,創(chuàng)建好了最外層那么我們接下來就是要創(chuàng)建次外層了。這里使用了二級指針。
array[i]=(int*)malloc(n2* sizeof(int));//第二維
在創(chuàng)建次外層的過程中我們使用了一個for語句,千萬別忘了使用for循環(huán)語句,這是絕大多數(shù)人的一個易錯點。
創(chuàng)建好了接下來我們該講到釋放了,而釋放的時候從里層往外層,逐層釋放。剛剛與我們上面的創(chuàng)建相反,在以上代碼中我們首先使用了下面一個for循環(huán)來釋放里層。
for(i=0;i<n1;i++)
{
free(array[i]);//釋放第二維指針
}
在通過以下語句來釋放外層。
free(array);//釋放第一維指針
如果出現(xiàn)多維的情況怎么做呢,我們接下來再來看看一個三維動態(tài)數(shù)組的創(chuàng)建和釋放,以加深下讀者的印象。代碼如下:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n1,n2,n3;
int ***array;
int i,j,k;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:");
scanf("%d",&n1);
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:");
scanf("%d",&n2);
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第三維長度:");
scanf("%d",&n3);
array=(int***)malloc(n1*sizeof(int**));//第一維
for(i=0; i<n1; i++)
{
array[i]=(int**)malloc(n2*sizeof(int*)); //第二維
for(j=0;j<n2;j++)
{
array[i][j]=(int*)malloc(n3*sizeof(int)); //第三維
}
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
for(k=0;k<n3;k++)
{
array[i][j][k]=i+j+k+1;
printf("%d\t",array[i][j][k]);
}
printf("\n");
}
printf("\n");
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//釋放第三維指針
}
}
for(i=0;i<n1;i++)
{
free(array[i]);//釋放第二維指針
}
free(array);//釋放第一維指針
return 0;
}
運行結(jié)果為:

請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:3
請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:3
請輸入所要創(chuàng)建的動態(tài)數(shù)組的第三維長度:3
1 2 3
2 3 4
3 4 5
2 3 4
3 4 5
4 5 6
3 4 5
4 5 6
5 6 7
Press any key to continue
看了以上三維動態(tài)數(shù)組的創(chuàng)建和釋放代碼以后,我想讀者這個時候已經(jīng)可以自己編寫任意維的動態(tài)數(shù)組了。但是細心的讀者可能發(fā)現(xiàn)了一個問題,那就是我們所講的動態(tài)數(shù)組都是一次性創(chuàng)建好的,如果接下來在使用的過程中我們使用的數(shù)組需要擴展或者刪減一些不再使用元素該怎么辦呢?!接下來我們先看一段關(guān)于動態(tài)數(shù)組擴展的代碼,在此以一維動態(tài)數(shù)組的擴展為例,其它的以此類推。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i,n1,n2;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:");
scanf("%d",&n1);
n=(int*)calloc(n1,sizeof(int));
printf("請輸入所要擴展的動態(tài)數(shù)組的長度:");
scanf("%d",&n2);
p=(int*)realloc(n,(n2)*sizeof(int));//動態(tài)擴充數(shù)組
for(i=0;i<n2;i++)
{
p[i]=i+1;
if(i%5==0)
printf("\n");
printf("%d\t",p[i]);
}
free(p);
return 0;
}
運行結(jié)果如下:

請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:6
請輸入所要擴展的動態(tài)數(shù)組的長度:25
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25 Press any key to continue
接下來如何縮小動態(tài)數(shù)組。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i,n1,n2;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:");
scanf("%d",&n1);
n=(int*)calloc(n1,sizeof(int));
for(i=0;i<n1;i++)
{
n[i]=i+1;
if(i%5==0)
printf("\n");
printf("%d\t",n[i]);
}
printf("\n請輸入所要縮小的動態(tài)數(shù)組的長度:");
scanf("%d",&n2);
p=(int*)realloc(n,(n2)*sizeof(int));
for(i=0;i<n2;i++)
{
if(i%5==0)
printf("\n");
printf("%d\t",p[i]);
}
printf("\n");
free(p);
return 0;
}
運行結(jié)果為:

請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:25
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
請輸入所要縮小的動態(tài)數(shù)組的長度:15
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Press any key to continue
在這里值得注意的一點就是在縮減動態(tài)數(shù)組的時候,它是刪除了后面的元素,而前面的元素保持不變。在使用realloc()函數(shù)的時候要由其注意它的使用規(guī)則。
到此這篇關(guān)于C語言 動態(tài)分配數(shù)組案例詳解的文章就介紹到這了,更多相關(guān)C語言 動態(tài)分配數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解
這篇文章主要為大家詳細介紹了C++數(shù)據(jù)結(jié)構(gòu)中哈希算法的相關(guān)資料,文中的示例代碼講解詳細,具有一定的借鑒價值,希望對大家有所幫助2022-12-12
C++實現(xiàn)LeetCode(81.在旋轉(zhuǎn)有序數(shù)組中搜索之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(81.在旋轉(zhuǎn)有序數(shù)組中搜索之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C++?STL標準庫std::vector擴容時進行深復(fù)制原因詳解
我們知道,std::vector之所以可以動態(tài)擴容,同時還可以保持順序存儲,主要取決于其擴容復(fù)制的機制。當容量滿時,會重新劃分一片更大的內(nèi)存區(qū)域,然后將所有的元素拷貝過去2022-08-08

