C++ 将值赋给struct';s字段,也更改其他变量

C++ 将值赋给struct';s字段,也更改其他变量,c++,C++,简单代码 #include <iostream> using namespace std; struct foo { int bar; }; struct foo tab[2]; int sum = 0; int main() { tab[2].bar = 3; //this change 'sum' value! cout << sum << endl; return 0; } #包括 使用名称空间std; 结构foo

简单代码

#include <iostream>
using namespace std;

struct foo {
    int bar;
};
struct foo tab[2];

int sum = 0;

int main()
{
    tab[2].bar = 3; //this change 'sum' value!
    cout << sum << endl;
    return 0;
}
#包括
使用名称空间std;
结构foo{
int-bar;
};
结构foo选项卡[2];
整数和=0;
int main()
{
tab[2].bar=3;//此更改为'sum'值!

cout数组从0开始,因此tab[2]将是第三个元素,但您只分配了其中的2个


在这种情况下,sum直接位于tab之后的内存中,因此当您转到第三个tab所在的位置时,实际上是sum所在的内存中。

数组从0开始,因此tab[2]将是第三个元素,但您只分配了其中的两个


在这种情况下,sum直接位于tab之后的内存中,因此当您转到第三个tab所在的位置时,您实际上位于sum的内存中。

请注意,您访问的
tab[2]
是一个溢出(其大小为2,因此有效索引为0和1)。
因此
tab[2]
访问
sum

的内存地址。请注意,您访问的
tab[2]
是一个溢出(其大小为2,因此有效索引为0和1)。
因此
tab[2]
在声明变量时访问
sum

的内存地址

struct foo tab[2];
选项卡[2]
不存在。 你只能这样做

tab[0].bar = 3

tab[1].bar = 3

因为在声明变量时,数组索引从0开始,在
arraySize-1

结束

struct foo tab[2];
选项卡[2]
不存在。 你只能这样做

tab[0].bar = 3

tab[1].bar = 3

因为数组索引从0开始,在
arraySize-1

结束,如果仔细查看,选项卡的长度为2。通过访问索引2,您访问的是选项卡外的内存,这意味着您访问的是总和


这就是您更改总和的原因。

如果仔细查看,选项卡的长度为2。通过访问索引2,您正在访问选项卡外的内存,这意味着您正在访问总和


这就是您更改总和的原因。

首先,打开编译器警告!如果您允许编译器帮助您,那么它很可能会指出此行中的确切错误:

根据您使用的编译器,警告可能如下所示:

warning: array subscript is above array bounds
struct foo tab[2];
有两个索引为0和1的元素,您尝试访问不存在的第三个元素。这将导致程序的未定义行为。无论得到什么结果,它都是随机的。您的程序也可能随机崩溃



注意,您的代码也是半C和半C++,这不好。您不需要编写<代码> StuttFoo<代码>,当您想引用<代码> Foo类型时,就足以编写<代码> Foo<代码>。代替原始数组,<代码> STD::数组< /代码>,和<代码>使用命名空间STD;不应默认使用。

< P> FIRS。首先,打开编译器警告!如果您允许编译器帮助您,那么它很可能会指出这一行中的确切错误:

根据您使用的编译器,警告可能如下所示:

warning: array subscript is above array bounds
struct foo tab[2];
有两个索引为0和1的元素,您尝试访问不存在的第三个元素。这将导致程序的未定义行为。无论得到什么结果,它都是随机的。您的程序也可能随机崩溃



注意,您的代码也是半C和半C++,这不好。您不需要编写<代码> StuttFoo<代码>,当您想引用<代码> Foo类型时,就足以编写<代码> Foo<代码>。代替原始数组,<代码> STD::数组< /COD>。和<代码>使用命名空间STD;不应默认使用。< P>数组A访问超出范围。有关详细信息,请参阅。数组访问超出范围。有关详细信息,请参阅。