我正在尝试将数据保存在结构中的向量中。由于我不知道每个数据的长度,我使用了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;
}
答案 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
}
&data
错了,你想要价值
data[xxx]
的作用类似于“获取值”操作。 (粗略地说)
还有内存泄漏: -
DATA_STRUCT *data = new DATA_STRUCT[5];
没有删除的新,所以我也添加了delete[] data;
。 (感谢 juanchopanza )
回答 Tom de Geus : -
有什么方法可以避免新的在这里?
这是更好的版本: -
DATA_STRUCT data[5];
add(data);
cout << data[0].words[0] << endl;
<强> Live demo 强>
回答OP的其他问题: -
为什么我们可以使用箭头代替点? add函数中的数据是指针的结构吗?
data
是DATA_STRUCT*
(&data)
是DATA_STRUCT**
(&data)[i]
是DATA_STRUCT*
(&data)[i]->
是DATA_STRUCT
(&data)[i]->words
为DATA_STRUCT::words
这是一个错误的地址,但就(仅)语法而言,它是正确的 错误的地址〜未定义的行为=可以正常工作/工作但错误/崩溃