返回信息流struct click_meg_ldp{
uint16_t _msg_type;
uint16_t _msg_len;
uint16_t _msg_id;
vector<uint32_t> _msg_TLV; //注意这个
};
msg_ldp =reinterpret_cast< click_meg_ldp *>( q->data() + sizeof(click_hdr_ldp));
msg_ldp->_msg_type=LDP_MappingMSG;
msg_ldp->_msg_len=sizeof(click_meg_ldp);
msg_ldp->_msg_id=LDP_AddressMSG;
msg_ldp->_msg_TLV.push_back(1200);
上面最后一句出问题啊 以下是调试信息
Program received signal SIGSEGV, Segmentation fault.
0x0812407b in Vector<unsigned int>::reserve (this=0x81c4f24, want=32)
at ../include/click/vector.cc:113
113 new(velt(new_l, i)) T(_l[i]);
好像是下面哪里出错了呀
(msg_ldp->_msg_TLV).push_back(1200);
(gdb)
81 if (_n < _capacity || reserve(RESERVE_GROW)) {
(gdb)
126 return _addr;
(gdb)
81 if (_n < _capacity || reserve(RESERVE_GROW)) {
(gdb)
是reserve()时候出错了吗 难道是我结构体里面的声明有错误?
这是一条镜像帖。来源:北邮人论坛 / cpp / #20382同步于 2009/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
大虾帮忙看看 不会用vector啊!!!
pigpigping
2009/3/18镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
TLV......这个。。。。。。。。。
既然都TLV了还vector干嘛,长度(L)都是固定的。
lz是不是想直接把这个struct套到一个char[]型的buffer上,然后读数据阿?
vector是个对象,里面可不仅仅是数据。
【 在 wks 的大作中提到: 】
: TLV......这个。。。。。。。。。
: 既然都TLV了还vector干嘛,长度(L)都是固定的。
: lz是不是想直接把这个struct套到一个char[]型的buffer上,然后读数据阿?
: ...................
如果不用vector,用一般的数组就可以了
struct click_meg_ldp{
uint16_t _msg_type;
uint16_t _msg_len;
uint16_t _msg_id;
uint32_t _msg_TLV[4]; //注意这个
};
然后把msg_ldp->_msg_TLV.push_back(1200);
改成msg_ldp->_msg_TLV[1]=1200;就可以了
大虾能说出为什么用vector时不行吗,我对vector很不懂啊!!!
说了,vector是个对象。里面除了数据,还存着别的东西。
想象一下如果你要定义自己的vector类,你会怎么定义呢?
class vector {
char buffer[1024];这样?那么长度怎么办?
};
【 在 wks 的大作中提到: 】
: 说了,vector是个对象。里面除了数据,还存着别的东西。
: 想象一下如果你要定义自己的vector类,你会怎么定义呢?
: class vector {
: ...................
我还是看不太懂啊 我就是想在结构体里放一个vector对象 然后用push_back往对象里面写东西,比如1200这个整数 这样是哪里出问题了呢 不好意思 我是第一次接触vector 头脑很乱
让我仔细琢磨琢磨。。。
msg_ldp =reinterpret_cast< click_meg_ldp *>( q->data() + sizeof(click_hdr_ldp));
q->data() + sizeof(click_hdr_ldp)地址后的两字节被认为是_msg_type,没问题
q->data() + sizeof(click_hdr_ldp)+2地址后的两字节被认为是_msg_len,没问题
q->data() + sizeof(click_hdr_ldp)+4地址后的两字节被认为是_msg_id,没问题
当你在结构体里用uint32_t _msg_TLV[4];这样声明的话
q->data() + sizeof(click_hdr_ldp)+6地址后的16字节被认为是_msg_TLV,没问题
当你在结构体里用vector<uint32_t> _msg_TLV;这样声明的话
q->data() + sizeof(click_hdr_ldp)+6地址后的n字节被认为是一个vector对象
这个对象何时构造的?构造函数调用了么?
正如楼上所说
一个对象里面还存着其他的东西
你直接把那个地址后的一段数据强制认为是一个vector对象,来调用vector::push_back()
是会出问题的
个人看法
【 在 guo 的大作中提到: 】
: msg_ldp =reinterpret_cast< click_meg_ldp *>( q->data() + sizeof(click_hdr_ldp));
: q->data() + sizeof(click_hdr_ldp)地址后的两字节被认为是_msg_type,没问题
: q->data() + sizeof(click_hdr_ldp)+2地址后的两字节被认为是_msg_len,没问题
: ...................
嗯 是我想当然了 我再把思路理一理
谢谢大虾解答!
我想再问一下:
我是没有构造出struct click_meg_ldp这个结构体,只是在一段内存上强行用一个click_meg_ldp *指针去指向这段空内存的开始位置,
1,这样以后为什么
既然能指到_msg_type,_msg_len,_msg_id这些对象,为什么却指不到vector对象
2,我没有构造出struct click_meg_ldp这个结构体,为什么还能指到里面的整型变量呢?是不是在用指针强行指向这段空内存时,其实已经在内存上有产生出这个结构体了
并不是说“产生出这个结构体”
这段内存的数据就在那儿放着呢
你可以把第1、2字节解释成一个uint16_t,把第3、4字节解释成uint16_t
也可以把第1234字节解释成一个unint32_t
但是你把它当成一个类的对象来用可能就有问题了
一个是基本数据类型
一个是类
区别就在这里
【 在 pigpigping 的大作中提到: 】
: 我想再问一下:
: 我是没有构造出struct click_meg_ldp这个结构体,只是在一段内存上强行用一个click_meg_ldp *指针去指向这段空内存的开始位置,
: 1,这样以后为什么
: ...................
【 在 guo 的大作中提到: 】
: 并不是说“产生出这个结构体”
: 这段内存的数据就在那儿放着呢
: 你可以把第1、2字节解释成一个uint16_t,把第3、4字节解释成uint16_t
: ...................
嗯 谢谢大侠 前面说的都看懂了 就最后一句还没搞明白
一个是基本数据类型
一个是类
区别就在这里
基本数据类型 不也是类吗 只是C++已经帮我们定义好了 它里面除了数据 也应该有函数呀 比如+ - * /等
1,还是这些函数已经被直接在编译器实现了而没有做为类的函数 这就是他们的区别??
2,而且竟然可以把某段字节解释成vector<uint32_t>类型的,而类的函数又没有存放在这段内存里,存放的仅仅是数据和可能的指针,那为什么不能调用push_back(1200)来操作这段内存呢