为什么在C/C++中,接收MD arr的func param需要具有所有子数组/维度的大小?
这里(PDF):它说MD arrs的唯一区别是"编译器会记住每个想象的维度"但是当我违反这些维度时,编译器什么都不做,例如:
char arr[3][5];
arr[0][5] = 10;
Run Code Online (Sandbox Code Playgroud)
那么,记住那些尺寸有什么意义呢?
对数组的索引访问必须基于索引值和声明的较低维度以行 - 主顺序计算内存偏移计算.更多关于这一点.
但首先,你的问题与这个简单的观察紧密相关:
void foo( char a[] )
{
a[5] = 'a';
}
// caller of foo() from somewhere
char arr[5];
foo(arr);
Run Code Online (Sandbox Code Playgroud)
为什么编译器让你做那?因为这是C,你完全有权利用未定义的行为射击自己的脚.记住这一点:
void foo( char a[][5] )
{
a[0][5] = 'a';
}
// caller of foo() from somewhere
char arr[4][5];
foo(arr);
Run Code Online (Sandbox Code Playgroud)
它与先前的代码一样"有效"(即您有权进入UB,风险和风险).在这种情况下,它将"工作",但仅仅因为底层数组的线性背景是二十个元素宽,我们只访问第六个元素,这在技术上arr[1][0].
这些劣质尺寸的目的是要正确计算像访问此:
void foo( char a[][5] )
{
a[2][1] = 'b';
}
Run Code Online (Sandbox Code Playgroud)
的2优良指数必须使用声明下尺寸(在这种情况下5)有效地计算线性适当元素的偏移量.在一维线性块中布置2D数组,它用于执行此操作:
char arr[20]; // 4*5
arr[2*5+1] = 'b';
Run Code Online (Sandbox Code Playgroud)
请注意5.必须知道声明的劣等维度,才能正确计算行间距(词性).
我希望这至少让它更清晰一些.
我应该注意这种化合物.即,以下内容:
char arr[3][4][5];
arr[1][2][3] = 'c';
Run Code Online (Sandbox Code Playgroud)
有效地计算基础数组的线性背景下的正确位置:
char arr[60]; // 3*4*5
arr[ 1*(4*5) + 2*(5) + 3 ] = 'c';
Run Code Online (Sandbox Code Playgroud)
等等.把它带到你想要的那么多尺寸.必须知道所有较低的尺寸才能正确地做到这一点.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |