C ++:struct in struct,push_back error

时间:2017-05-01 04:56:41

标签: c++ vector struct

我正在尝试将数据保存在结构中的向量中。由于我不知道每个数据的长度,我使用了push_back。但是,for loop无效,我在第一个Command terminated循环后获得了i

我尝试了几个答案,例如this,但没有一个可行。

以下是我尝试的简化版本(并提供相同的错误):

#include <iostream>
#include <vector>

using namespace std;

typedef struct{
    vector<int> words;
}DATA_STRUCT;

void add(DATA_STRUCT *data){
    for(int i=0; i<5; i++){
        for(int s=0;s<3; s++){
            (&data)[i] -> words.push_back(s);
            cout << i << s << endl;
        }
    }
}

int main(){
    DATA_STRUCT *data = new DATA_STRUCT[5];
    add(data);
    cout << (&data)[0] -> words[0] << endl;
}

2 个答案:

答案 0 :(得分:2)

问题在于:

(&data)[i] -> words.push_back(s);

&data评估为DATA_STRUCT **data。通过使用(&data)[i],您将访问不应该使用的内存,这会导致未定义的行为。

这条线可以简单得多。

data[i].words.push_back(s);

答案 1 :(得分:1)

你快到了。这是正确的方法: -

#include <iostream>
#include <vector>

using namespace std;

typedef struct{
    vector<int> words;
}DATA_STRUCT;

void add(DATA_STRUCT *data){
    for(int i=0; i<5; i++){
        for(int s=0;s<3; s++){
            data[i].words.push_back(s);  //<-- edit
            cout << i << s << endl;
        }
    }
}

int main(){
    DATA_STRUCT *data = new DATA_STRUCT[5]; 
    add(data);
    cout << data[0].words[0] << endl;  //<-- edit
    delete[] data;                     //Thank juanchopanz
}

Live demo

&data错了,你想要价值 data[xxx]的作用类似于“获取值”操作。 (粗略地说)

修改

还有内存泄漏: -

DATA_STRUCT *data = new DATA_STRUCT[5];  

没有删除,所以我也添加了delete[] data;。 (感谢 juanchopanza

EDIT2

回答 Tom de Geus : -

  

有什么方法可以避免新的在这里?

这是更好的版本: -

DATA_STRUCT data[5];
add(data);
cout << data[0].words[0] << endl;

<强> Live demo

EDIT2

回答OP的其他问题: -

  

为什么我们可以使用箭头代替点? add函数中的数据是指针的结构吗?

dataDATA_STRUCT*
(&data)DATA_STRUCT** (&data)[i]DATA_STRUCT* (&data)[i]->DATA_STRUCT (&data)[i]->wordsDATA_STRUCT::words

这是一个错误的地址,但就(仅)语法而言,它是正确的 错误的地址〜未定义的行为=可以正常工作/工作但错误/崩溃