为struct的字段赋值,也可以更改其他变量

时间:2016-03-13 11:02:05

标签: 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;
}

导致3而不是0。这是令人难以置信的,所以可能我错过了一些东西。我做错了什么?

5 个答案:

答案 0 :(得分:3)

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

在这种情况下,sum在tab后面的内存中,所以当你去第三个标签的位置时,你实际上是在内存中求和。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

声明变量时

struct foo tab[2];

tab[2]不存在。 你只能做

tab[0].bar = 3

tab[1].bar = 3

因为数组索引从 0 开始,到arraySize-1结束。

答案 3 :(得分:1)

如果仔细观察,tab的长度为2.通过访问索引2,您将从选项卡中访问内存,这意味着您正在访问sum。

这就是你改变总和的原因。

答案 4 :(得分:0)

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

List<Employee> list = ...
list.sort(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getName));

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

tab[2].bar = 3; //this change 'sum' value!

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

请注意,您的代码也是一半C和一半C ++。这不好。如果要引用struct foo tab[2];类型,则无需编写struct foo,只需编写foo即可。可以使用foo而不是原始数组。默认情况下不应使用std::array<Foo, 2>