BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #20382同步于 2009/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

大虾帮忙看看 不会用vector啊!!!

pigpigping
2009/3/18镜像同步9 回复
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()时候出错了吗 难道是我结构体里面的声明有错误?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wks机器人#1 · 2009/3/18
TLV......这个。。。。。。。。。 既然都TLV了还vector干嘛,长度(L)都是固定的。 lz是不是想直接把这个struct套到一个char[]型的buffer上,然后读数据阿? vector是个对象,里面可不仅仅是数据。
pigpigping机器人#2 · 2009/3/18
【 在 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很不懂啊!!!
wks机器人#3 · 2009/3/18
说了,vector是个对象。里面除了数据,还存着别的东西。 想象一下如果你要定义自己的vector类,你会怎么定义呢? class vector { char buffer[1024];这样?那么长度怎么办? };
pigpigping机器人#4 · 2009/3/18
【 在 wks 的大作中提到: 】 : 说了,vector是个对象。里面除了数据,还存着别的东西。 : 想象一下如果你要定义自己的vector类,你会怎么定义呢? : class vector { : ................... 我还是看不太懂啊 我就是想在结构体里放一个vector对象 然后用push_back往对象里面写东西,比如1200这个整数 这样是哪里出问题了呢 不好意思 我是第一次接触vector 头脑很乱 让我仔细琢磨琢磨。。。
guo机器人#5 · 2009/3/18
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() 是会出问题的 个人看法
pigpigping机器人#6 · 2009/3/18
【 在 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,没问题 : ................... 嗯 是我想当然了 我再把思路理一理 谢谢大虾解答!
pigpigping机器人#7 · 2009/3/18
我想再问一下: 我是没有构造出struct click_meg_ldp这个结构体,只是在一段内存上强行用一个click_meg_ldp *指针去指向这段空内存的开始位置, 1,这样以后为什么 既然能指到_msg_type,_msg_len,_msg_id这些对象,为什么却指不到vector对象 2,我没有构造出struct click_meg_ldp这个结构体,为什么还能指到里面的整型变量呢?是不是在用指针强行指向这段空内存时,其实已经在内存上有产生出这个结构体了
guo机器人#8 · 2009/3/18
并不是说“产生出这个结构体” 这段内存的数据就在那儿放着呢 你可以把第1、2字节解释成一个uint16_t,把第3、4字节解释成uint16_t 也可以把第1234字节解释成一个unint32_t 但是你把它当成一个类的对象来用可能就有问题了 一个是基本数据类型 一个是类 区别就在这里 【 在 pigpigping 的大作中提到: 】 : 我想再问一下: : 我是没有构造出struct click_meg_ldp这个结构体,只是在一段内存上强行用一个click_meg_ldp *指针去指向这段空内存的开始位置, : 1,这样以后为什么 : ...................
pigpigping机器人#9 · 2009/3/19
【 在 guo 的大作中提到: 】 : 并不是说“产生出这个结构体” : 这段内存的数据就在那儿放着呢 : 你可以把第1、2字节解释成一个uint16_t,把第3、4字节解释成uint16_t : ................... 嗯 谢谢大侠 前面说的都看懂了 就最后一句还没搞明白 一个是基本数据类型 一个是类 区别就在这里 基本数据类型 不也是类吗 只是C++已经帮我们定义好了 它里面除了数据 也应该有函数呀 比如+ - * /等 1,还是这些函数已经被直接在编译器实现了而没有做为类的函数 这就是他们的区别?? 2,而且竟然可以把某段字节解释成vector<uint32_t>类型的,而类的函数又没有存放在这段内存里,存放的仅仅是数据和可能的指针,那为什么不能调用push_back(1200)来操作这段内存呢