C++ 請擅用 vector。
1. 一維陣列
1-1. 配置
#define N 10 /* Allocate N integer */ int *a = (int*)malloc(sizeof(int)*N); if(a==NULL) printf("malloc fail.\n"); /* Allocate N double */ double *b = (double*)malloc(sizeof(double)*N); if(b==NULL) printf("malloc fail.\n");
1-2. 釋放
free(a); free(b);
2. 二維陣列
2-1. 低效能配置、釋放
#define M 10 #define N 5 /* int A[M][N] */ /* 配置 */ int **A = (int**)malloc(sizeof(int*)*M); for(int i=0; i!=M; ++i) A[i] = (int*)malloc(sizeof(int)*N); /* 釋放 */ for(int i=0; i!=M; ++i) free(A[i]); free(A);
2-2 較佳方式
#define M 10 #define N 5 /* 配置時 */ int **A = (int**)malloc(sizeof(int*)*M); int *tmp = (int*) malloc(sizeof(int)*M*N); for(int i=0; i!=M; ++i, tmp+=N) A[i] = tmp; /* 清空時 */ memset(*A, 0, sizeof(int)*M*N); /* 釋放時 */ free(*A); free(A);
2-3 包成副函式
/* 副函式 */ void** malloc2dim(unsigned x, unsigned y, unsigned element_size) { void** p = (void**)malloc(sizeof(void*)*x); char* tmp = (char*)malloc(element_size*x*y); for(unsigned i=0; i!=x; ++i) { p[i] = tmp; tmp += (element_size*y); } return p; } /* 調用 */ #define M 10 #define N 5 int **A = (int**)malloc2dim(M, N, sizeof(int)); /* 釋放 */ free(*A); free(A);
2-4 一維取代多維
會大量調用 function / malloc,維護性較差,此處不予示範。
3. Array Index Management
這在某本原文數值分析之書上有看到,沒看過 function body 長得如何,推測應與下類似,但這方法所藏之危機確實不少,唯可能為筆者不願初學者在學數值分析時,被記憶體配置問題所困擾,故寫了份較為方便調用之方式。 假設生成一陣列,欲存取的是 a[10..20],這裡的 10 給予變數叫 start, 20 給予變數叫 end, 直接來看範例
#include <stdio.h> int *ivector(int start, int end) { int *x = (int*)malloc(sizeof(int)*(end-start-1)); return x-start; } void free_ivector(int *x, int start, int end) { free(x+start); } int main() { int start=5, end=10, i, cnt=0; int *ivec = ivector(start, end); for(i=start; i<=end; ++i) ivec[i]=++cnt; for(i=start; i<=end; ++i) printf("ivec[%d]=%d\n", i,ivec[i]); free_ivector(ivec, start, end); return 0; }
二維的話也類似做法
#include <stdio.h> /* * sx: start x * ex: end x * sy: start y * ey: end y * */ int **imatrix(int sx, int ex, int sy, int ey) { int i, j; int **x = (int**)malloc(sizeof(int*)*(ex-sx+1)); x-=sx; for(i=sx; i<=ex; ++i){ x[i]=(int*)malloc(sizeof(int)*(ey-sy+1)); x[i]-=sy; } return x; } void free_imatrix(int **x, int sx, int ex, int sy, int ey) { int i; for(i=sx; i<=ex; ++i) free(x[i]+sy); free(x+sx); } int main() { int i, j, cnt=0; int sx=-1, ex=+2, sy=1000, ey=1005; int **mat = imatrix(sx, ex, sy, ey); for(i=sx; i<=ex; ++i) for(j=sy; j<=ey; ++j) mat[i][j]=++cnt; for(i=sx; i<=ex; ++i) for(j=sy; j<=ey; ++j) printf("mat[%d][%d]=%d\n", i, j, mat[i][j]); free_imatrix(mat, sx, ex, sy, ey); return 0; }
這種設計模式我想是針對,對 array index 並不熟的人而使用的,仔細探討,隱藏的問題應可挖出不少出來,做為一思考,於此停筆。
全站熱搜