Re: [問題] 動態配置記憶體

看板C_and_CPP (C/C++)作者 (下班後才下棋)時間16年前 (2009/02/12 18:02), 編輯推噓5(500)
留言5則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《NoobImage (老人家)》之銘言: : ※ 引述《PcGrek (PcGrek)》之銘言: : : 推薦另一種動態配置的寫法, : : 用這種方法配出來的記憶體區塊是連續的, : : 釋放記憶體時簡單,也可以用 a[x][y] 這種型式的定址法。 : : double** mat = (double**)malloc( h*sizeof(double* )+ : : w*h*sizeof(double)); : : double* x = (double* )(mat + h); : : for(int y = 0; y!=h ; ++y, x+=w ) : : mat[y] = x; : : free(mat); : 解釋一下嗎? P大 : double** mat = (double**)malloc( h*sizeof(double* )+ : w*h*sizeof(double)); : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : 產生一組 double**型態 大小 h個(double*) + w*h個(double) : 我們不是要 w*h*(double)就好了嗎? : 一個double mat[h][w]他的大小 不就只有 h*w*(double) : 那h*sizeof(double* ) 不就多配置了? 如果是只要配置一維的陣列 那麼原本的 h*w*sizeof(double) 就可以了 double *mat; ┌─┐ ┌──────────┐ mat │───→ │ h*w*sizeof(double) │ └─┘ │ │ │ │ │ │ │ │ 如果是要配置二維的陣列 double **mat ┌─┐ mat │││ └│┘ ↓ ┌─┐ ┌──────────┐ mat[0] │───→ │ h*w*sizeof(double) │ ├─┤ │ │ mat[1] │───→ │ │ ├─┤ │ │ mat[2] │───→ │ │ ├─┤ │ │ ↑ └── 這一排就是多出來的 h*sizeof(double*) 原 post 後面的那段 for(int y = 0; y!=h ; ++y, x+=w ) mat[y] = x; 就是要把這一排 pointer array 指到正確的位址上 -- 有時候,遺忘,是令人快樂的。什麼時候?當然是有人傷了你的心的時候。  存心傷你的那個人,固然是故意和你過不去,但是被傷了心而耿耿於懷的你  ,卻是和自己過不去了。所以,記性不好的人,通常會是比較快樂的人,也  是比較不容易被擊倒的人。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.54 ※ 編輯: ledia 來自: 140.112.30.54 (02/12 18:03) ※ 編輯: ledia 來自: 140.112.30.54 (02/12 18:04)

02/12 18:05, , 1F
原來是這樣~ 了解了!
02/12 18:05, 1F

02/12 19:40, , 2F
嗚嗚 我太高興了 用這個方法 我終於解決18011篇的問題
02/12 19:40, 2F

02/12 21:20, , 3F
推「圖文並茂」XD
02/12 21:20, 3F

02/12 22:02, , 4F
講義級的
02/12 22:02, 4F

02/16 01:07, , 5F
好幾天沒來版上看了,感謝ledia圖文並茂的解說 :)
02/16 01:07, 5F
文章代碼(AID): #19a_FFf- (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #19a_FFf- (C_and_CPP)