close
- 動態配置空間不會消失,所以使用完用不到需要用free釋放空間
- 所有配置記憶體函數,都會回傳配置區域第一個指標,若無法配置(Allocate),回傳NULL
- 所有配置記憶體函數,因回傳為Void*(泛型指標),需用(類型)將回傳指轉型成要存入的指標類型
- 所有配置記憶體函數,都需宣告一個指標來存取
- 若直接宣告陣列,該陣列名稱為一個常數位址,動態配置之陣列為變數指標
- 陣列無法用變數指定大小,而動態配置可以
malloc
- malloc會配置所要求的記憶體空間並回傳該區第一個指標,所配置的空間無初始化
- 定義的指標=(資料型態*)malloc(要分配的大小) //malloc會回傳所配置的空間第一個位址
- sizeof(資料型態) //自動取得該型態大小
- (資料型態)//將之後方的東西轉換成該資料型態
int N; scanf("%d",&N); int *arr=(int*)malloc(N*sizeof(int)); //arr[N]; int *arr2=0; arr2=(int*)malloc(N*sizeof(int)); //與上面相等
calloc
- calloc會配置所要求的空間並回傳該區第一個指標,並在所配置的空間自動填入0
- 定義的指標=(資料型態*)calloc(陣列大小,類型大小) //calloc會回傳所配置的空間第一個位址
int N; scanf("%d",&N); int *arr=(int*)calloc(N,sizeof(int)); //arr[N]={0}; int *arr2=0; arr2=(int*)calloc(N,sizeof(int)); //與上面相等
realloc
- 與VB reDim相似
- realloc在指標配置一個所填入的大小空間,再將來源的資料複製進去,Source可以與Destination相等
- 配置失敗回傳NULL,所以Src跟Dst重複的話會有風險
- 定義的指標=(資料型態*)realloc(來源指標,要分配的大小) //realloc會回傳所配置的空間第一個位址
- 來源指標可以為NULL,將realloc視為malloc
int N; scanf("%d", &N); int *arr = (int*)malloc(N * sizeof(int)); for (x = 1; x <= N; x++) arr[x - 1] = x; int *arr2 = 0; arr2 = (int*)realloc(arr, (N + 1) * sizeof(int));//arr2[N+1]; arr2全部與arr1相同只差在arr2筆arr1大1 for (x = 0; x < N + 1; x++) printf("%d ", arr2[x]);
free
- 釋放已經定義的記憶體區塊,因為動態配置記憶體不會消失
- free(指標)
- free可以用來造句
int *arr=(int*)calloc(5,sizeof(int)); free (arr); printf("%d",a[0]);show
動態二維陣列(很多種實現方法)
- 腦補法 : 直接配置height*width個空間,用腦袋模擬Arr[ width * y + x ]=Arr[y][x]
- 全部擠在一起 : 如下第一個,全部擠在一起,最前端當指標的指標,後面放資料,在將前端link到資料
- 一維跟全部 : 如下第二種,用一指標的指標配置一個height空間(做第一維Arr[i]),再用一指標配置所有資料的空間,用迴圈將全部資料每隔一個width link到Arr[i]
- 迴圈一次配置一次 : 無提供,定義一指標的指標配置height空間(做第一維Arr[i]),用迴圈繞完height,並在每圈配置一個一維陣列並link第一筆資料的位置到第一維
int** twoDarr1(int width, int height) { int *subArr; int** Arr = (int**)malloc(height * sizeof(int *) +width*height * sizeof(int)); /* 索引+所有int空間 Arr= 指向資料陣列的指標 Arr+0 Arr+1 Arr+2....Arr+height-1 Arr+height(第[0][0]筆資料) Arr+height+1...Arr+height+width-1; Arr+height+width(第[1][0]筆).. . . */ int i = 0; subArr = (int *)(Arr + height); for (; i < height; i++, subArr += width) Arr[i] = subArr; return Arr; }
int** twoDarr2(int width,int height) { int* subArr = (int*)calloc(width*height , sizeof(int)); int** Arr = (int**)calloc(height, sizeof(int*)); int i=0; for (; i < width*height; i += width) Arr[i / width] = subArr + i; return Arr; }
// 動態記憶體測試.cpp : 定義主控台應用程式的進入點。 // #include "stdafx.h" #include<stdlib.h> int* mem_alive_test(void) { int *a= (int*)calloc(5, sizeof(int)); return a; } void mem_alive_test2(int**b) { *b = (int*)calloc(5, sizeof(int)); } int** twoDarr1(int width, int height) { int *subArr; int** Arr = (int**)malloc(height * sizeof(int *) +width*height * sizeof(int)); /* 索引+所有int空間 Arr= 指向資料陣列的指標 Arr+0 Arr+1 Arr+2....Arr+height-1 Arr+height(第[0][0]筆資料) Arr+height+1...Arr+height+width-1; Arr+height+width(第[1][0]筆).. . . */ int i = 0; subArr = (int *)(Arr + height); for (; i < height; i++, subArr += width) Arr[i] = subArr; return Arr; } int** twoDarr2(int width,int height) { int* subArr = (int*)calloc(width*height , sizeof(int)); int** Arr = (int**)calloc(height, sizeof(int*)); int i=0; for (; i < width*height; i += width) Arr[i / width] = subArr + i; return Arr; } int main() { int*a=0; int **twoDa = twoDarr2(3, 4); //mem_alive_test2(&a);//Pass //a=mem_alive_test();// Pass //a = (int*)malloc(5 * sizeof(int)); //Pass //a = (int*)realloc(a,5 * sizeof(int));//Pass int x = 0, y = 0; /*for(;y<3;y++) for (x = 0; x < 4; x++) twoDa[y][x] = x + 4*y; */ int N; scanf("%d", &N); int *arr = (int*)malloc(N * sizeof(int)); for (x = 1; x <= N; x++) arr[x - 1] = x; //arr[] int *arr2 = 0; arr2 = (int*)realloc(arr, (N + 1) * sizeof(int));//arr2[N+1] for (x = 0; x < N + 1; x++) printf("%d ", arr2[x]); return 0; }
文章標籤
全站熱搜
留言列表