话说这C中
![](/icons/90571de.gif)
动态获取 2维
![](/icons/90571shuzu.gif)
好比艺术作品中
![](/icons/90571de.gif)
爱情(好烂
![](/icons/90571de.gif)
比喻~~)
![](/icons/90571dou.gif)
都是永恒而难缠
![](/icons/90571de.gif)
主题
![](/icons/90571dou2.gif)
假期写并行
![](/icons/90571de.gif)
作业
![](/icons/90571dou.gif)
又碰到了这个问题
![](/icons/90571dou.gif)
依然绞尽脑汁
![](/icons/90571dou2.gif)
其实 2维
![](/icons/90571shuzu.gif)
理解起来是很容易
![](/icons/90571de.gif)
![](/icons/90571dou.gif)
![](/icons/90571yi.gif)
维
![](/icons/90571de.gif)
是void *
![](/icons/90571dou.gif)
2维自然就是void **
![](/icons/90571dou.gif)
高维以此类推
![](/icons/90571dou2.gif)
然而多了
![](/icons/90571yi.gif)
个和数个*好比
![](/icons/90571yi.gif)
个“不可逾越
![](/icons/90571de.gif)
障壁”
![](/icons/90571dou2.gif)
不过直接申请**
![](/icons/90571dou.gif)
![](/icons/90571chushi.gif)
化很难并且退回也很难
![](/icons/90571dou2.gif)
上次遇到
![](/icons/90571de.gif)
时候就直接malloc了
![](/icons/90571yi.gif)
个width * height大小
![](/icons/90571de.gif)
区域
![](/icons/90571dou.gif)
然后写
![](/icons/90571yi.gif)
个取值
![](/icons/90571de.gif)
宏
![](/icons/90571dou2.gif)
看起来很丑陋
![](/icons/90571dou2.gif)
这次决定做个了断
![](/icons/90571dou2.gif)
搜到台湾
![](/icons/90571yi.gif)
个技术论坛
![](/icons/90571dou.gif)
找到了这个终极方案
![](/icons/90571dou.gif)
真
![](/icons/90571de.gif)
很妙~
![](/icons/90571chengxu.gif)
如下:
![\"\"](\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.g<img)
\" align=top>
void**malloc2d(
w,
h,
size)
![]()
...{
\" align=top>
j;
\" align=top>
rowSize=w*size;
\" align=top>
indexSize=h*
(void*);
\" align=top>void**a=(void**)malloc(indexSize+h*rowSize);
\" align=top>char*dataStart=
(char*)a+indexSize;
\" align=top>for(j=0;j<h;j
)
\" align=top>a[j]=dataStart+j*rowSize;
\" align=top>
a;
\" align=top>}参数w
![](/icons/90571dou.gif)
h是所申请 2维
![](/icons/90571shuzu.gif)
![](/icons/90571de.gif)
列数和行数
![](/icons/90571dou.gif)
size是
![](/icons/90571shuzu.gif)
单元
![](/icons/90571de.gif)
字节数
![](/icons/90571dou2.gif)
比如
![](/icons/90571dou.gif)
申请
![](/icons/90571yi.gif)
个4*5
![](/icons/90571de.gif)
![](/icons/90571int.gif)
型
![](/icons/90571de.gif)
2维
![](/icons/90571shuzu.gif)
![](/icons/90571dou.gif)
使用:
=Code>
![](/icons/90571int.gif)
**m = (
![](/icons/90571int.gif)
**) malloc2d(5, 5,
![](/icons/90571sizeof.gif)
(
![](/icons/90571int.gif)
));
直接使用m[x][y]即可以引用x行y列
![](/icons/90571de.gif)
值
![](/icons/90571dou2.gif)
退回时
![](/icons/90571dou.gif)
直接使用free(m)即可
![](/icons/90571dou2.gif)
跟白老鼠开始
![](/icons/90571de.gif)
![](/icons/90571chengxu.gif)
相比
![](/icons/90571dou.gif)
改了
![](/icons/90571yi.gif)
些地方
![](/icons/90571dou.gif)
返值改成void **
![](/icons/90571dou.gif)
(char *)(a + h)改成了(char *) a + h
![](/icons/90571dou2.gif)
加进了
![](/icons/90571yi.gif)
些循环外
![](/icons/90571de.gif)
计算
![](/icons/90571dou2.gif)
解释
![](/icons/90571yi.gif)
下~就好像原帖里面cromayen2000所讲
![](/icons/90571de.gif)
![](/icons/90571dou.gif)
动态申请 2维
![](/icons/90571shuzu.gif)
通常需要
![](/icons/90571yi.gif)
个index区域和
![](/icons/90571yi.gif)
个数据区域
![](/icons/90571dou2.gif)
index区域保存每
![](/icons/90571yi.gif)
行数据区域
![](/icons/90571de.gif)
首地址
![](/icons/90571dou.gif)
数据区域存放实际
![](/icons/90571de.gif)
值
![](/icons/90571dou2.gif)
m
![](/icons/90571de.gif)
地址是index区域
![](/icons/90571de.gif)
首地址
![](/icons/90571dou2.gif)
这样
![](/icons/90571dou.gif)
对 2维
![](/icons/90571shuzu.gif)
中x行y列元素
![](/icons/90571de.gif)
引用m[x][y]
![](/icons/90571dou.gif)
实际上是
![](/icons/90571yi.gif)
个两步
![](/icons/90571de.gif)
运算
![](/icons/90571dou2.gif)
首先
![](/icons/90571dou.gif)
m是
![](/icons/90571yi.gif)
个
![](/icons/90571int.gif)
**
![](/icons/90571de.gif)
元素
![](/icons/90571dou2.gif)
m[x]是*(m + x)
![](/icons/90571dou.gif)
即index区域
![](/icons/90571dou.gif)
第x个元素内
![](/icons/90571de.gif)
值
![](/icons/90571dou.gif)
这个值就是数据区域第x行
![](/icons/90571de.gif)
起始地址
![](/icons/90571dou2.gif)
*(m + x)
![](/icons/90571de.gif)
类型是
![](/icons/90571int.gif)
*
![](/icons/90571dou2.gif)
的后
![](/icons/90571dou.gif)
寻找第y列
![](/icons/90571de.gif)
值
![](/icons/90571dou2.gif)
就是*(*(m + x) + y)
![](/icons/90571dou2.gif)
正好对
![](/icons/90571int.gif)
**进行两次解除引用
![](/icons/90571dou2.gif)
得到
![](/icons/90571yi.gif)
个
![](/icons/90571int.gif)
![](/icons/90571dou2.gif)
而写成中括号
![](/icons/90571de.gif)
表示法
![](/icons/90571dou.gif)
m[x][y]
![](/icons/90571dd.gif)
= *(*(m + x) + y)
![](/icons/90571dou2.gif)
白老鼠
![](/icons/90571de.gif)
![](/icons/90571hanshu.gif)
把index和数据区域连在了
![](/icons/90571yi.gif)
起
![](/icons/90571dou2.gif)
+====+
+--+--* |〔0〕
| |----|
+----+--* |〔1〕
| | |----|
| | ~ ~
| | |----|
+------+--* |〔h-1〕
| | | +====+
| | |
| | | 〔0〕 〔w-1〕
| | | +======================+
| | +->| |〔0〕
| | |----------------------|
| +--->| |〔1〕
| |----------------------|[Page]
| ~ ~
| |----------------------|
+----->| |〔h-1〕
+======================+
嗯
![](/icons/90571dou.gif)
这个ASCII图画
![](/icons/90571de.gif)
真是绝妙
![](/icons/90571dou2.gif)
佩服台湾
![](/icons/90571de.gif)
技术人员
![](/icons/90571dou2.gif)
首先
![](/icons/90571dou.gif)
区域
![](/icons/90571de.gif)
总长度h *
![](/icons/90571sizeof.gif)
(void *) + h * rowSize
![](/icons/90571dou2.gif)
前
![](/icons/90571yi.gif)
个加数就是index区域
![](/icons/90571de.gif)
长度
![](/icons/90571dou2.gif)
即h个void *指针
![](/icons/90571de.gif)
长度
![](/icons/90571dou2.gif)
后面
![](/icons/90571de.gif)
加数就是数据区
![](/icons/90571de.gif)
长度
![](/icons/90571dou.gif)
h个rowSize
![](/icons/90571dou2.gif)
数据区
![](/icons/90571de.gif)
开始也就是开始指针后移整个index区后
![](/icons/90571de.gif)
地址
![](/icons/90571dou2.gif)
即地址dataStart
![](/icons/90571dou2.gif)
循环把后面
![](/icons/90571de.gif)
数据区每
![](/icons/90571yi.gif)
行开始地址连接到前面
![](/icons/90571de.gif)
index区域
![](/icons/90571dou2.gif)
![](/icons/90571yi.gif)
个malloc
![](/icons/90571dou.gif)
![](/icons/90571yi.gif)
个free
![](/icons/90571dou.gif)
![](/icons/90571yi.gif)
个 2维
![](/icons/90571shuzu.gif)
![](/icons/90571dou.gif)
妙哉~
这个思路方法要比直接栈上申请多
![](/icons/90571yi.gif)
个index区域
![](/icons/90571dou.gif)
思路和申请w * h大小
![](/icons/90571de.gif)
区域然后算出每
![](/icons/90571yi.gif)
个元素地址根本不
![](/icons/90571yi.gif)
样
![](/icons/90571dou2.gif)
帖子
![](/icons/90571de.gif)
后面讨论了
![](/icons/90571yi.gif)
下字节对齐
![](/icons/90571de.gif)
问题
![](/icons/90571dou2.gif)
白老鼠应该是藐视了字节对齐
![](/icons/90571de.gif)
重要性了
![](/icons/90571dou2.gif)
稍微弄
![](/icons/90571yi.gif)
下SSE也会有感觉
![](/icons/90571dou.gif)
字节不对齐
![](/icons/90571de.gif)
话会不见血
![](/icons/90571de.gif)
死掉
![](/icons/90571de.gif)
![](/icons/90571dou2.gif)
按照这个
![](/icons/90571hanshu.gif)
![](/icons/90571dou.gif)
只需要保证数据区
![](/icons/90571de.gif)
字节对齐就可以了
![](/icons/90571dou2.gif)
思路方法是在index和数据区域的间加上padding
![](/icons/90571dou2.gif)
白老鼠随手写出来
![](/icons/90571de.gif)
![](/icons/90571chengxu.gif)
疑似有问题
![](/icons/90571dou2.gif)
自己写了
![](/icons/90571yi.gif)
个
![\"\"](\"http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.g<img)
\" align=top>
void
**malloc2d(
width,
height,size_tsize,
align)
![]()
...{
\" align=top>//allocallspaces:indexarea,largestpaddingareaanddataarea
\" align=top>
index_size=
(void*)*height;
\" align=top>
row_size=size*width;
\" align=top>void**p=(void**)malloc(index_size+align+height*row_size);
\" align=top>//computepadding
\" align=top>char*ptr_index_ending=(char*)p+index_size;
\" align=top>
padding=(align-((
)ptr_index_ending+1)%align)%align;
\" align=top>//linkindexareaanddataarea
\" align=top>//startingaddressofdataarea
\" align=top>char*ptr_data=ptr_index_ending+1+padding;
\" align=top>for(
i=0;i<height;i
)
![]()
...{
\" align=top>p[i]=ptr_data;
\" align=top>ptr_data
size*width;
\" align=top>}
p;
\" align=top>} 在申请总大小
![](/icons/90571de.gif)
时候把最大可能
![](/icons/90571de.gif)
padding申请出来(就是要对齐
![](/icons/90571de.gif)
字节数本身)
![](/icons/90571dou.gif)
然后链接
![](/icons/90571de.gif)
时候
![](/icons/90571dou.gif)
数据区
![](/icons/90571de.gif)
首地址根据整片区域
![](/icons/90571de.gif)
首地址数值(a
![](/icons/90571de.gif)
地址)
![](/icons/90571dou.gif)
加上index区
![](/icons/90571de.gif)
大小
![](/icons/90571dou.gif)
适当后移到对齐
![](/icons/90571de.gif)
字节数上
![](/icons/90571dou2.gif)
[Page]
测试了
![](/icons/90571yi.gif)
下应该是好使
![](/icons/90571de.gif)
![](/icons/90571dou.gif)
嗯
![](/icons/90571dou2.gif)
最后还是赞
![](/icons/90571yi.gif)
下台湾
![](/icons/90571de.gif)
PG们
![](/icons/90571dou.gif)
可以看到大家
![](/icons/90571de.gif)
回帖里面重要
![](/icons/90571de.gif)
概念都附上了wiki
![](/icons/90571de.gif)
地址
![](/icons/90571dou.gif)
认真劲儿很了不起啊
延伸阅读
最新评论