Re: [問題] Dynamic Array Index Management In C
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間14年前 (2011/08/01 13:19)推噓8(8推 0噓 31→)留言39則, 5人參與討論串2/2 (看更多)
※ 引述《tropical72 (藍影)》之銘言:
: 但在主函式裡面,它反而又是這麼寫
: int main()
: {
: int i, j, cnt, **ivec = imatrix(1, 10, 1, 15); // ivec[1..10][1..15]
: for(cnt=0, i=1; i<=10; ++i)
: for(j=1; j<=15; ++j)
: ivec[i][j]=++cnt;
: free_imatrix(ivec, 1, 10, 1, 15);
: return 0;
: }
: --------
: 以 int **a = imatrix(start_x, end_x, start_y, end_y) 而言,
: 我「推測」做法應類似如下 (跳過 catch malloc fail 情況),
: 也想請教這裡是否有更佳之做法。
: int ** imatrix(unsigned sx, unsigned ex, unsigned sy, unsigned ey)
: {
: int **t;
: unsigned i, j;
: t = (int**)malloc(sizeof(int*) * (ex+1) ); /* 0~ex */
: /* 這行是我猜的 */
: for(i=0; i<sx; ++i) free(t[i]);
不能這樣寫
整塊 malloc 的就只能整塊 free
不能分期付款
: for(i=sx; i<=ex; ++i) t[i] = (int*)malloc(sizeof(int) * (ey+1) );
: /* 下面這兩行也是我猜的 */
: for(i=sx; i<=ex; ++i)
: for(j=0; j!=sy; ++j) free(&t[i][j]);
: return t;
: }
: 這麼做,無疑效率變非常差,甚至會有嚴重空洞現象,
: 想請問是否有其它想法
: 這方法我認為有一嚴重缺點,sx、sy 本身起始值很大時,
: a[100000..100002][100000..100002]
: 本來只是要 [0..2][0..2] , malloc 可說幾乎必成功,
: 但要先配 100003 個,有可能導致失敗。
: -----------
: 以上,謝謝各位不吝指教,感激不盡 *^_^*
這個沒有你想像的那麼難
考慮一下一維的情況
double *a;
a[x] = ...
其中的 a[x] 意指 *(a+x)
你只需要調整 a 的值,讓 a+x 會落在配置出來的範圍即可
所以如果我們這樣寫
double* ivec(int sx, int ex)
{
double* a = malloc(sizeof(double) * (ex-sx+1));
return a - sx;
}
void foo(void)
{
double vec = ivec(100000, 100010)
for(int i = 100000; i <= 100010; ++i)
vec[i] = i;
}
實際上這個一維陣列只用了 11 個元素的空間
只是他傳回來的指標,離開頭有 100000 個元素的位移
所以你用起來的時候,感覺就像是有 100011 個元素一樣
當然開頭 100000 個元素是配置以外的空間
對它進行存取是違法的
二維陣列的情況是一樣的:
double** imatrix(int sx, int ex, int sy, int ey)
{
double** a = (double**) malloc( sizeof(double*) * (ex-sx+1) );
a -= sx;
for(int x = sx; x <= ex; ++x){
a[x] = (double*) malloc( sizeof(double) * (ey-sy+1) )
a[x] -= sy;
}
return a;
}
不過,我個人認為這樣的設計非常槽糕、容易出錯又難以 debug
關鍵在於你取得的指標並非指向配置空間的開頭
因此當你要 free 的時候,必需要傳入原始的 sx 及 sy 才能正確釋放所有的空間
真要這樣搞的話,最好用 struct 以及相關函式做好包裝
(不過就算這樣還是很容易寫 bug 啦...畢竟它是 C...)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.15.163
推
08/01 13:23, , 1F
08/01 13:23, 1F
推
08/01 13:25, , 2F
08/01 13:25, 2F
推
08/01 13:27, , 3F
08/01 13:27, 3F
→
08/01 13:53, , 4F
08/01 13:53, 4F
→
08/01 13:54, , 5F
08/01 13:54, 5F
推
08/01 13:55, , 6F
08/01 13:55, 6F
→
08/01 14:00, , 7F
08/01 14:00, 7F
→
08/01 14:00, , 8F
08/01 14:00, 8F
※ 編輯: littleshan 來自: 114.32.15.163 (08/01 14:02)
推
08/01 14:12, , 9F
08/01 14:12, 9F
→
08/01 15:02, , 10F
08/01 15:02, 10F
→
08/01 15:02, , 11F
08/01 15:02, 11F
推
08/01 15:20, , 12F
08/01 15:20, 12F
yeah...被抓包了 XD
※ 編輯: littleshan 來自: 114.32.15.163 (08/01 18:09)
推
08/01 18:29, , 13F
08/01 18:29, 13F
→
08/01 18:29, , 14F
08/01 18:29, 14F
→
08/01 18:31, , 15F
08/01 18:31, 15F
→
08/01 18:42, , 16F
08/01 18:42, 16F
→
08/01 18:52, , 17F
08/01 18:52, 17F
→
08/01 18:55, , 18F
08/01 18:55, 18F
→
08/01 19:05, , 19F
08/01 19:05, 19F
→
08/01 19:12, , 20F
08/01 19:12, 20F
→
08/01 19:15, , 21F
08/01 19:15, 21F
→
08/01 19:48, , 22F
08/01 19:48, 22F
→
08/01 20:48, , 23F
08/01 20:48, 23F
→
08/01 20:49, , 24F
08/01 20:49, 24F
→
08/01 21:00, , 25F
08/01 21:00, 25F
→
08/01 21:00, , 26F
08/01 21:00, 26F
→
08/01 21:00, , 27F
08/01 21:00, 27F
→
08/02 03:02, , 28F
08/02 03:02, 28F
→
08/02 03:03, , 29F
08/02 03:03, 29F
→
08/02 03:03, , 30F
08/02 03:03, 30F
→
08/02 03:04, , 31F
08/02 03:04, 31F
→
08/02 03:05, , 32F
08/02 03:05, 32F
→
08/02 03:11, , 33F
08/02 03:11, 33F
→
08/02 03:11, , 34F
08/02 03:11, 34F
→
08/02 03:16, , 35F
08/02 03:16, 35F
→
08/02 10:29, , 36F
08/02 10:29, 36F
→
08/02 11:33, , 37F
08/02 11:33, 37F
推
08/02 20:06, , 38F
08/02 20:06, 38F
→
08/02 20:06, , 39F
08/02 20:06, 39F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章