close

 

  • 動態配置空間不會消失,所以使用完用不到需要用free釋放空間
  • 所有配置記憶體函數,都會回傳配置區域第一個指標,若無法配置(Allocate),回傳NULL
  • 所有配置記憶體函數,因回傳為Void*(泛型指標),需用(類型)將回傳指轉型成要存入的指標類型
  • 所有配置記憶體函數,都需宣告一個指標來存取
  • 若直接宣告陣列,該陣列名稱為一個常數位址,動態配置之陣列為變數指標
  • 陣列無法用變數指定大小,而動態配置可以

malloc

  1. malloc會配置所要求的記憶體空間並回傳該區第一個指標,所配置的空間無初始化
  2. 定義的指標=(資料型態*)malloc(要分配的大小) //malloc會回傳所配置的空間第一個位址
  3. sizeof(資料型態) //自動取得該型態大小
  4. (資料型態)//將之後方的東西轉換成該資料型態
	int N;
	scanf("%d",&N);
	int *arr=(int*)malloc(N*sizeof(int));
	//arr[N];
	int *arr2=0;
	arr2=(int*)malloc(N*sizeof(int));
	//與上面相等

calloc

  1. calloc會配置所要求的空間並回傳該區第一個指標,並在所配置的空間自動填入0
  2. 定義的指標=(資料型態*)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

  1. 與VB reDim相似
  2. realloc在指標配置一個所填入的大小空間,再將來源的資料複製進去,Source可以與Destination相等
  3. 配置失敗回傳NULL,所以Src跟Dst重複的話會有風險
  4. 定義的指標=(資料型態*)realloc(來源指標,要分配的大小) //realloc會回傳所配置的空間第一個位址
  5. 來源指標可以為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

  1. 釋放已經定義的記憶體區塊,因為動態配置記憶體不會消失
  2. free(指標)
  3. free可以用來造句
	int *arr=(int*)calloc(5,sizeof(int));
	free (arr);
	printf("%d",a[0]);
show

動態二維陣列(很多種實現方法)

  1. 腦補法 : 直接配置height*width個空間,用腦袋模擬Arr[ width * y + x ]=Arr[y][x]
  2. 全部擠在一起 : 如下第一個,全部擠在一起,最前端當指標的指標,後面放資料,在將前端link到資料
  3. 一維跟全部 : 如下第二種,用一指標的指標配置一個height空間(做第一維Arr[i]),再用一指標配置所有資料的空間,用迴圈將全部資料每隔一個width link到Arr[i]
  4. 迴圈一次配置一次 : 無提供,定義一指標的指標配置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;
}


arrow
arrow

    繩繩 發表在 痞客邦 留言(0) 人氣()