看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
NoobImage:原來是這樣~ 了解了! 02/12 18:05
NoobImage:嗚嗚 我太高興了 用這個方法 我終於解決18011篇的問題 02/12 19:40
saxontai:推「圖文並茂」XD 02/12 21:20
kvykn:講義級的 02/12 22:02
PcGrek:好幾天沒來版上看了,感謝ledia圖文並茂的解說 :) 02/16 01:07