作者ledia (下班後才下棋)
看板C_and_CPP
标题Re: [问题] 动态配置记忆体
时间Thu Feb 12 18:02:53 2009
※ 引述《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)
1F:推 NoobImage:原来是这样~ 了解了! 02/12 18:05
2F:推 NoobImage:呜呜 我太高兴了 用这个方法 我终於解决18011篇的问题 02/12 19:40
3F:推 saxontai:推「图文并茂」XD 02/12 21:20
4F:推 kvykn:讲义级的 02/12 22:02
5F:推 PcGrek:好几天没来版上看了,感谢ledia图文并茂的解说 :) 02/16 01:07