简单代码
#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。这是令人难以置信的,所以可能我错过了一些东西。我做错了什么?
答案 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>
。