C :struct中的向量,push_back错误
C++: vector in struct, push_back error
我正在尝试将数据保存在构造中的向量中。由于我不知道每个数据的长度,因此我使用了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回答其他问题: -
为什么我们可以使用箭头代替点?添加函数中的数据是指针的结构吗?
data
是DATA_STRUCT*
(&data)
是DATA_STRUCT**
(&data)[i]
是DATA_STRUCT*
(&data)[i]->
是DATA_STRUCT
(&data)[i]->words
是DATA_STRUCT::words
这是一个错误的地址,但按(仅(语法术语,这是正确的。
错误的地址〜不确定的行为=可以正常工作/工作,但错误/崩溃
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法