C :struct中的向量,push_back错误

C++: vector in struct, push_back error

本文关键字:push back 错误 向量 struct      更新时间:2023-10-16

我正在尝试将数据保存在构造中的向量中。由于我不知道每个数据的长度,因此我使用了push_back。但是,for loop不起作用,我在第一个i循环之后得到了Command terminated

我尝试了几个这样的答案,但是它们都没有起作用。

这是我尝试过的简化版本(并给出相同的错误(:

#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;
}

问题在于:

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

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

该行可以简单得多。

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

您几乎在那里。这是正确的方法: -

#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 ,所以我还添加了delete[] data;。(感谢 juanchopanza (

EDIT2

回答 tom de geus : -

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

这是更好的版本: -

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

live demo

edit2

从OP回答其他问题: -

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

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

这是一个错误的地址,但按(仅(语法术语,这是正确的。
错误的地址〜不确定的行为=可以正常工作/工作,但错误/崩溃