假設有一個規定長度的數組,如何擴容呢?最容易想到的是通過如下方式擴容:
class Program{static void Main(string[] args){int[] arrs = new[] {1, 2, 3, 4, 5};arrs[5] = 6;}}
報錯:未處理IndexOutOfRanageException,索引超出了數組界限。
□ 創建一個擴容的臨時數組,然後賦值給原數組,使用循環遍歷方式
static void Main(string[] args){int[] arrs = new[] {1, 2, 3, 4, 5};int[] temp = new int[arrs.Length + 1];//遍歷arrs數組,把該數組的元素全部賦值給temp數組for (int i = 0; i < arrs.Length; i++){temp[i] = arrs[i];}//把臨時數組賦值給原數組,這時原數組已經擴容arrs = temp;//給擴容後原數組的最後一個位置賦值arrs[arrs.Length - 1] = 6;foreach (var item in arrs){Console.WriteLine(item);}Console.ReadKey();}
□ 創建一個擴容的臨時數組,然後賦值給原數組,使用Array的靜態方法
像這種平常的數組間的拷貝,Array類肯定為我們准備了靜態方法:Array.Copy()。
static void Main(string[] args){int[] arrs = new[] {1, 2, 3, 4, 5};int[] temp = new int[arrs.Length + 1];Array.Copy(arrs, temp, arrs.Length);//把臨時數組賦值給原數組,這時原數組已經擴容arrs = temp;//給擴容後原數組的最後一個位置賦值arrs[arrs.Length - 1] = 6;foreach (var item in arrs){Console.WriteLine(item);}Console.ReadKey();}
□ 使用Array的靜態方法擴容
但是,拷貝來拷貝去顯得比較繁瑣,我們也可以使用Array.Resize()方法給數組擴容。
static void Main(string[] args){int[] arrs = new[] {1, 2, 3, 4, 5};Array.Resize(ref arrs, arrs.Length + 1);//給擴容後原數組的最後一個位置賦值arrs[arrs.Length - 1] = 6;foreach (var item in arrs){Console.WriteLine(item);}Console.ReadKey();}
總結:數組擴容優先考慮使用Array的靜態方法Resize,其次考慮把一個擴容的、臨時的數組賦值給原數組。
那我改下之前的回答,你的意思就是要做個內存管理堆棧系統嘛。
可以考慮這麼做。
int *p = NULL;
p = malloc(xxx* sizeof(int)); //xxx你的存儲空間總得有個大小吧
int *pFirst = p;
int size = 0;
然後封裝一個int * my_malloc(malloc_size)
{
int ret_val = size;
size += malloc_size;
return p[size];
}
這個函數記載返回空間的首地址
每次輸入一個數據時調用my_malloc加上你輸入數據的大小就可以了。
js定義變量很靈活的
var arr = ();
var arr = [];
var arr = new Array();
這些都可以。