What is (multi+1)?
What is *(multi+1)?
它們是一樣的!
都是 &multi[1][0] 這個 address
multi[row][col] 等於 *( *( multi + row) + col)
*ptr++ 等價於 *(ptr++) ... 什麼鬼東西= =
*dynamic memory allocation of n-dimensional array (n>1)
A. 二段式分配法,先尻重拳,再追加昇龍拳!
int** rowptr;
rowptr = malloc( nrows * sizeof(int *) );
rowptr[i] = malloc( ncols * sizeof(int) );
總共有1+nrows次的malloc呼叫
雖然可以使用rowptr[i][j]這種array notation的方式來存取
但是實際上memory是不連續的
B. 放大绝先,再慢慢消血!
int** rowptr;
int* aptr;
aptr = malloc( nrows * ncols * sizeof(int) );
rowptr = malloc( nrows * sizeof( int * ) );
/* ............................ */
rowptr[0] = aptr + ( 0 * ncols );
rowptr[1] = aptr + ( 1 * ncols );
rowptr[2] = aptr + ( 2 * ncols );
/* ............................ */
總共只有兩次的malloc
優點是事先分配的一大塊空間是連續的
所以使用像memset( ) 這樣的函數可以一次到位
缺點是記憶體空間的使用比較沒有彈性
例如使用 free( ) 函數時
需要一整塊還回去
沒有留言:
張貼留言