C++ C++;数组和溢出

C++ C++;数组和溢出,c++,C++,我对下面的代码理解有误。根据我的理解,tester声明应该返回指向两个元素的第一个数组的指针,即[1,2],因此*(tester+1)应该返回[3,4],它只有2个元素,那么调用(*(tester+1))[2]有什么意义呢。本例顺便打印数字5。非常感谢您的澄清 int main() { int tester[][2]{ 1,2,3,4,5,6 }; cout << (*(tester + 1))[2] << endl; return 0; } i

我对下面的代码理解有误。根据我的理解,
tester
声明应该返回指向两个元素的第一个数组的指针,即[1,2],因此
*(tester+1)
应该返回[3,4],它只有2个元素,那么调用
(*(tester+1))[2]
有什么意义呢。本例顺便打印数字5。非常感谢您的澄清

int main() {
    int tester[][2]{ 1,2,3,4,5,6 };
    cout << (*(tester + 1))[2] << endl;
    return 0;
}
intmain(){
int tester[][2]{1,2,3,4,5,6};

cout当你声明一个二维数组时,所有的元素都是连续的。整个数组是一个单一的对象,所以当你超过一个行限制时,你不会越界,因为你仍然在数组中。所以
tester[1,1]
之后的下一个元素是
tester[2,0]
,这就是
(*(tester+1))[2]
访问。

[2]高于[1]处的最高元素,因为索引从[0]开始

有三个数组

[1,2] positions 0,0 and 0,1
[3,4] positions 1,0 and 1,2
[5,6] positions 2,0 and 2,1
由于所有数组在数据段中彼此相邻,因此第二个数组(tester+1)的越界会溢出到第三个数组中,从而得到第三个数组的第一个元素。
i、 e.位置1,2与2,0相同

int tester[][2]{1,2,3,4,5,6}
创建一个2乘3的数组

tester[0][0] = 1
tester[0][1] = 2
tester[1][0] = 3
tester[1][1] = 4
tester[2][0] = 5
tester[2][1] = 6
编译器
根据您的规范使用尽可能少的
内存创建数组。
[]2]
explicit表示以这样一种方式组织
数据
,即有
x
行和
2
列。因为您将
6个
元素放入
测试器
数组
编译器通过将总元素数除以n来决定要分配的
行数列数


此外,
(*(tester+1))[2]
,相当于
tester[2]
,它将访问第三行第一列中的元素。因此,返回
5

是编写此代码的另一种方法,这意味着您定义了向量,但它的作用类似于二维数组

  int main() {
     int tester[3][2]{ {1,2},{3,4},{5,6} };
     std::cout<< tester[1][2] <<std::endl;
     return 0;
   }
intmain(){
int tester[3][2]{{1,2},{3,4},{5,6};

std::coutnote关于是否允许读取一个数组的边界以访问该数组作为子对象的更大对象的其他成员,意见存在分歧。有些人将二维数组视为正方形存储区域,而事实上,正如您所说,它是连续的。因此,最好将其想象为一行。@M.M我有工作d在包含C的最先进的边界检查编译器的项目上。人们几乎一致认为,对于类似struct{char a[5];int b;}C;C[7]=0;-也就是说,不能依赖C[7]之类的东西,返回一个错误是可以的在b中或不在b中。可移植代码不能保证填充,尽管ABI可以。我知道很多代码都假设您可以在2d数组中超过行边界,因此我们的编译器默认情况下必须允许它。@KrazyGlew结构成员和数组元素之间存在差异。结构成员之间可以有填充,但在二维数组的行。数组按行的主要顺序连续存储。请避免使用反勾来强调单词。您可以使用粗体或斜体。没问题,我会处理它!@Paul我一直想尝试更多不同的强调方式。