作者snowlike (snowlike)
看板C_and_CPP
标题Re: [问题] malloc()和三维阵列
时间Tue Dec 8 23:39:49 2009
※ 引述《JULIKEBEN (啾西)》之铭言:
: 我用malloc尝试写配置三维的阵列
: 我不知道这样的结果对与否要怎样判断囧
除了让它出错之外,不晓得怎麽判断orz
: (程式码附在下方)
: 想请板上高手提供方法,,该如何验证此段程式码有无错误
: 我是采用印出位址的方式
: 可是好像malloc所配置的记忆体不一定会是连续(?)
同一次作的malloc会是连续的
: 而会能够相当於阵列的因素是,,他是利用pointer使其连续
: 但真实的记忆体位置却不一定如此
: 不知道这样解读对不对
: 另外有观察到
: 同一系列的会固定加四
: 可是要往下跳下一组,,就会没有规律的跳一些,,然後在往下加四
: 不知道这是不是正常现象
因为sizeof(int)的结果为4的关系,不然就不够放一个int
: 另外也想问,,
: 有办法用动态记忆体配出跟阵列宣告一样的结果吗
: 谢谢
一般阵列和指标阵列是不一样的东西
但照程式码来看,如果只是想让第三维的部份连续的话;可以参考以下
int st=3, ed=4, th=2, i, j, k=0;
int ***ary=(int***)malloc(st*sizeof(int**));
int *toGet=(int*)malloc(st*ed*th*sizeof(int));
for(i=0; i<st; ++i) {
ary[i]=(int**)malloc(ed*sizeof(int*));
for(j=0; j<ed; ++j, k+=th) {
ary[i][j]=toGet+k;
}
}
for(i=0; i<st; ++i) {
for(j=0; j<ed; ++j) {
for(k=0; k<th; ++k) {
printf("\t%p", &ary[i][j][k]);
}
printf("\n");
}
printf("\n");
}
free的部份就是ary, ary[i], toGet
也可以将其他部分的记忆体使用并在一起,喜欢的话
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.33.184.50
1F:推 JULIKEBEN:那个加四的部分,,我比较困惑的是,,为什麽会有一部分会 12/08 23:45
2F:→ JULIKEBEN:间断@@ 感谢你的回答=) 12/08 23:45
3F:→ VictorTom:你去观察一下间断的部份, 应该都发生在[i][j][k]最後那 12/08 23:57
4F:→ VictorTom:个[k]维度到底从0开始的时候; 因为每个一维[k]在你的程 12/08 23:58
5F:→ VictorTom:式里是分开要的, 所以这个地方就有机会有断层.... 12/08 23:58
6F:→ VictorTom:不希望间断, 就是希望连续的话, 请照s大这篇的作法写:) 12/08 23:59
7F:推 JULIKEBEN:懂了=) 感谢~不过可以顺带一问,,为什麽二维不会间断吗ha 12/09 00:02
8F:→ JULIKEBEN:正确说法应该是[j]维度 12/09 00:03
9F:→ JULIKEBEN:我刚打错了@@ 不是二维~是[k]维度 12/09 00:04
10F:→ JULIKEBEN:是[j] 囧 12/09 00:04
11F:推 VictorTom:[j]也是断的吧, 只是因为[k]就断给你看了.... 12/09 00:10
12F:→ VictorTom:你可以用你原来的code改印 &arr[i][j] //不要加[k]看:) 12/09 00:11
13F:→ VictorTom:应该会发现[j]到底从0开始时, 一样也是断开的@_@" 12/09 00:14
14F:推 JULIKEBEN:感谢=) 12/09 13:22