加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 当在recvfrom调用中使用时,Vector指向未初始化的字节

发布时间:2020-12-16 09:31:37 所属栏目:百科 来源:网络整理
导读:在我正在写的函数中,我试图返回一个指向无符号字符向量的指针.相关代码如下. std::vectorunsigned char *ret = new std::vectorunsigned char(buffSize,'0');//Due to suggestions...int n = recvfrom(fd_,ret,buffSize,recvAddress,sockSize);//Forgot to i
在我正在写的函数中,我试图返回一个指向无符号字符向量的指针.相关代码如下.

std::vector<unsigned char> *ret = new std::vector<unsigned char>(buffSize,'0');
//Due to suggestions...
int n = recvfrom(fd_,ret,buffSize,&recvAddress,&sockSize);
//Forgot to include this in the original
ret->resize(n);
// display chars somehow just for testing
for(std::vector<unsigned char>::iterator it=ret->begin(); it<ret->end();it++)
{
    std::cout<<*it;
}
std::cout<<std::endl;
...
return ret;

当我通过valgrind运行时,我得到的错误是关于recvfrom中的缓冲区如何指向未初始化的字节.我把它缩小到向量,因为我把它换成了一个unsigned char数组,一切正常.有什么建议?

编辑1:修正了一些代码,是从内存/笔记中做到这一点,我遇到了一个问题.我开始使用valgrind的原因是我在那个地方遇到了分段错误.我会仔细检查明天我在做什么.

解决方法

这条线错了:

int n = recvfrom(fd_,&sockSize);

它应该是:

int n = recvfrom(fd_,&(*ret)[0],&sockSize);

您正在将数据直接读取到std :: vector数据结构上,该结构通常是3个指针(开始,结束和存储结束).所以,你用套接字接收的数据覆盖了那3个指针,然后你在向量之后覆盖了随机内存.编译器不会抱怨,因为任何指针类型(在这种情况下为std :: vector< char> *)都可以隐式转换为void *(recvfrom的第二个参数).

您当然希望将数据读入向量所指向的缓冲区,该缓冲区是通过获取其第一个元素的地址获得的,即&(* ret)[0].我们必须添加笨拙的括号,因为bracket []的运算符优先级高于一元解引用运算符*.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读