1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言定义可变大小二维数组 C中使用动态二维数组

c语言定义可变大小二维数组 C中使用动态二维数组

时间:2021-08-20 00:44:50

相关推荐

c语言定义可变大小二维数组 C中使用动态二维数组

a[j] =

dataStart + j * rowSize;

return a;

}

参数w,h是所申请二维数组的列数和行数,size是数组单元的字节数。比如,申请一个4*5的int型的二维数组,使用:

int **m = (int **) malloc2d(5, 5, sizeof(int));

直接使用m[x][y]即可以引用x行y列的值。

退回时,直接使用free(m)即可。

跟白老鼠开始的程序相比,改了一些地方,返值改成void **,(char *)(a + h)改成了(char *) a +

h。加进了一些循环外的计算。

解释一下~就好像原帖里面cromayen2000所讲的,动态申请二维数组通常需要一个index区域和一个数据区域。index区域保存每一行数据区域的首地址,数据区域存放实际的值。m的地址是index区域的首地址。

这样,对二维数组中x行y列元素的引用m[x][y],实际上是一个两步的运算。

首先,m是一个int**的元素。m[x]是*(m +

x),即index区域,第x个元素内的值,这个值就是数据区域第x行的起始地址。*(m + x)的类型是int*。

之后,寻找第y列的值。就是*(*(m + x) +

y)。正好对int**进行两次解除引用。得到一个int。而写成中括号的表示法,m[x][y] === *(*(m + x) +

y)。

白老鼠的函数把index和数据区域连在了一起。

+====+

+--+--*|〔0〕

||----|

+----+--*|〔1〕

|||----|

||~~

|||----|

+------+--*|〔h-1〕

|||+====+

|||

|||〔0〕〔w-1〕

|||+======================+

||+->||〔0〕

|||----------------------|

|+--->||〔1〕

||----------------------|

|~~

||----------------------|

+----->||〔h-1〕

+======================+

嗯,这个ASCII图画的真是绝妙。佩服台湾的技术人员。

首先,区域的总长度h * sizeof(void *) + h * rowSize。前一个加数就是index区域的长度。即h个void

*指针的长度。后面的加数就是数据区的长度,h个rowSize。

数据区的开始也就是开始指针后移整个index区后的地址。即地址dataStart。循环把后面的数据区每一行开始地址连接到前面的index区域。

一个malloc,一个free,一个二维数组,妙哉~

这个方法要比直接栈上申请多一个index区域,思路和申请w * h大小的区域然后算出每一个元素地址根本不一样。

帖子的后面讨论了一下字节对齐的问题。白老鼠应该是藐视了字节对齐的重要性了。稍微弄一下SSE也会有感觉,字节不对齐的话会不见血的死掉的。按照这个函数,只需要保证数据区的字节对齐就可以了。方法是在index和数据区域之间加上padding。白老鼠随手写出来的程序疑似有问题。自己写了一个。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。