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

时间:2015-01-28 15:06:07

标签: c++ arrays gcc variable-assignment stdvector

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

struct A {
    int values[4];
};

std::vector<A> items;

items向量位于一个类中,在其头文件中定义。在类构造期间,向量用'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。

1 个答案:

答案 0 :(得分:1)

  

是否与项目向量的事实有关   在push_back调用期间修改,以某种方式使   左手边的   items[i].values[j] = getValue();声明?

是的,确实如此。

作业的各个部分未经确定排序,因此代码具有未定义的行为。

这些是非常难以追踪的错误,但&#34;功能&#34;允许一些低级优化 例如,如果函数调用是内联的,则左侧和右侧的计算可以交错,从而最大限度地减少停顿。