C语言中动态数组的作用,C语言实现动态数组
前言
在純C語言編程中,數組的創建必須是固定的大小,因為C語言本身沒有提供動態數組這種數據結構,這是一個讓習慣了使用高級語言編程的人轉做C開發面臨的一個很頭疼的問題,本篇文章就將介紹如何使用純C語言編程實現一個對象來作為動態數組。
閱讀本篇文章前,作者假設讀者已經對C語言的基礎概念有了一定了解,比如知道什么叫數組,知道C語言的基礎語法等。如果讀者還對C語言一無所知,請先對C語言做一個了解和入門級的學習之后,再來閱讀本篇文章。
1:C語言中的數組分析
1.int my_array[100];
如上的代碼,是使用C語言來創建了一個可以存放100個整數的數組,這個就是C語言中的數組。
2.這行代碼一共做了兩件事情:
(1):在棧或者全局數據區開辟了內存空間(如果是寫在某個函數的內部,就是在棧上開辟的空間,如果是寫在函數外面,就是在全局數據區上開辟的空間),開辟的內存空間大小為100*sizeof(int)個字節的內存空間。如果是在棧上開辟的,那么這塊內存空間會在走到所在函數return之后釋放,如果是在全局數據區,會隨著進程的結束而釋放。
(2):創建一個指針指向新開辟的內存區域,并將該區域的地址賦值給my_array保存,這樣,我們就可以通過下標來對數組中的成員進行訪問,比如:my_array[9]可以訪問第10個成員。此外,還可以通過取地址指向內容的方式來訪問數組成員,比如*(my_array+10),同樣可以得到和my_array[10]一樣的值。
3.從上面分析int my_array[100];這行代碼可以看出,數組的操作本質上就是內存的操作,小標的索引只是一種糖衣語法。
4.這種數組的缺點大家可以很容易想到,數組開辟的空間大小不根據實際數據的多少來決定,造成了空間上的浪費,另外當數據量大余數組的最大容量時,會造成程序的崩潰。
補充:有的朋友也許會說,按照上面的寫法開辟數組后,執行my_array[100]=1或者my_array[102]=1都不出現崩潰,這個只是因為你的運氣好,原因是在my_array指向的內存區域中,第101個或者第102位置正好有空間而已,因為我們寫my_array[100]只能保證有100個位置是可以使用的,至于100以后的,那就要看系統的“心情”了!
二.定義一個my_vector結構體
接下來要介紹動態數組使用到的結構體以及對應的方法聲明。首先創建一個myVector.h的文件,并編寫如下的代碼:
// my_vector默認大小
#define MY_VECTOR_DEF_SIZE 10
// 結構體定義
typedef struct {
int curSize; // 已用的大小
int maxSize; // 數組最大存儲大小
int *data; // 實際的數據地址
} my_vector;
// 初始化結構體
void InitMyVector(my_vector *vector);
// 追加成員
void AppendMyVector(my_vector *vector, int value);
// 返回指定下標中的數據,如果失敗返回-1
int GetMyVector(my_vector *vector, int index);
// 設置指定位置的指為指定數據
void SetMyVector(my_vector *vector, int index, int value);
// 將當前的my_vecotr存儲空間直接擴大一倍
void DoubleCapacityMyVector(my_vector *vector);
// 釋放資源
void FreeMyVector(my_vector *vector);
三.實現定義的my_vector結構體
聲明完成之后要做的就是實現聲明的函數了。創建一個myVector. C的文件,并編寫如下代碼:
#include
#include
#include "myVector.h"
// 初始化
void InitMyVector(my_vector *vector)
{
// 數據初始化
vector->curSize = 0;
vector->maxSize = MY_VECTOR_DEF_SIZE;
// 開辟存儲實際數據的空間
vector->data = (int*)malloc(sizeof(int) * vector->maxSize);
}
// 追加值
void AppendMyVector(my_vector *vector, int value)
{
// 空間不夠了需要增大
DoubleCapacityMyVector(vector);
// 添加新的數據到數組尾
vector->data[vector->curSize++] = value;
}
// 獲的值
int GetMyVector(my_vector *vector, int index)
{
// 輸入的數據如果小于0或者是大余數組最大存儲值時,直接退出程序,因為數據不合法
if (index >= vector->curSize || index < 0) { exit(1); } // 如果輸入的是一個合法的數據那么返回對應的數據 return vector->data[index];
}
// 設置值
void SetMyVector(my_vector *vector, int index, int value)
{
// 用0作為默認值來他填充數組
while (index >= vector->curSize)
{
AppendMyVector(vector, 0);
}
vector->data[index] = value;
}
// 擴大空間
void DoubleCapacityMyVector(my_vector *vector)
{
if (vector->curSize >= vector->maxSize)
{
// 擴大數組大小為當前的兩倍
vector->maxSize *= 2;
vector->data = (int*)realloc(vector->data, sizeof(int) * vector->maxSize);
}
}
//釋放空間
void FreeMyVector(my_vector *vector)
{
free(vector->data);
}
四.使用my_vector結構體創建結構體對象
創建一個main.c的文件,并編寫如下代碼
#include
#include "myVector.h"
int main()
{
// 聲明vector對象
my_vector vector;
int i;
// 初始化vector對象
InitMyVector(&vector);
// 隨便初始化點數據
for (i = 0; i <200; i++)
{
AppendMyVector(&vector, i);
}
// 測試用,在第200位置設置1,200之前的數據如果為空自動填充為0,當前程序就是200-299為0
SetMyVector(&vector, 300, 1);
// 測試用,取指定位置的數據
printf("%d\n", GetMyVector(&vector, 6));
// 測試用,輸出每一個成員
for (i = 0; i < vector.curSize; i++)
{
printf("%d %d\n", i, GetMyVector(&vector, i));
}
// 使用完之后要釋放,不然會有內存泄露
FreeMyVector(&vector);
return 0;
}
到此為止,我們已經實現了用C語言去創建動態數組,其實動態數組的本質也是靜態的,只不過空間的增加我們做了一些手動的處理而已。
類似的,刪除指定位置的數據也可以用上面的方式去實現。請大家自己理解學習嘗試進行實現!
C語言網, 版權所有丨如未注明 , 均為原創丨本網站采用BY-NC-SA協議進行授權 , 轉載請注明C語言實現動態數組!
總結
以上是生活随笔為你收集整理的C语言中动态数组的作用,C语言实现动态数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双linux grub rescue,G
- 下一篇: c语言字符串去重简单,C语言实现简单飞机