数组赋值仅适用于 C++ 中的中间变量

Array assignment only works with intermediate variable in C++

我有一个奇怪的问题,数组赋值只有在我使用中间变量时才有效。这是程序的设置:

struct A {
    int values[4];
};

std::vector<A> items;

items 向量在其头文件中定义的 class 中。该向量在 class 构建期间填充有 'A' 结构。 values 数组保持原样。在.cpp文件中的一个函数中,填充values数组的代码如下:

for(int i=0; i<items.size(); i++) {
    items[i].values[0] = 0;
    for(int j=1; j<4; j++) {
        items[i].values[j] = getValue(); // returns an int
        cout << items[i].values[j] << endl; // prints -1 for index 1 and 2
    }
}

如果我将内部循环更改为以下内容,它会正常工作:

    for(int j=1; j<4; j++) {
        int val = getValue(); // returns an int
        items[i].values[j] = val;
        cout << items[i].values[j] << endl; // prints correct value
    }

我检查了 getValue 函数,它似乎工作正常。这是它的代码:

int getValue() {
    items.push_back(A()); // just adds a new 'A' object to the vector
    return items.size() - 1;
}

它是否与 items 向量在 push_back 调用期间被修改这一事实有关,这以某种方式使 items[i].values[j] = getValue(); 语句的左侧无效?据我所知,代码中的其他地方没有任何内存问题。

附加信息: 我发布了代码的简化版本,但这基本上就是它正在做的事情。 'A' 结构内部还有一些变量需要分配。此外,此代码在 OS X 上运行正常,但在 Linux 上运行失败。使用 gcc/++ 4.4.7.

Does it have something to do with the fact that the items vector is modified during the push_back call, which somehow invalidates the left-hand side of the
items[i].values[j] = getValue(); statement?

是的,确实如此。

赋值的两边没有确定的顺序,因此代码具有未定义的行为。

这些错误很难追踪,但 "feature" 允许进行一些低级优化。
例如,如果函数调用是内联的,则左右两侧的计算可以交错进行,从而最大限度地减少停顿。