为了账号安全,请及时绑定邮箱和手机立即绑定

不知道为什么后面str数据没有追加到m_pData里,得到的结果想是10abcd!求解

不知道为什么后面str数据没有追加到m_pData里,得到的结果想是10abcd!求解

小怪兽爱吃肉 2022-03-17 19:15:14
void WriteData(void *data,int len){char * newPos=m_pData+m_iWriteOffset;memcpy(newPos,data,len);m_iWriteOffset+=len;}上面这个函数只是为了能过多次调用WriteData来把一些数据写到m_pData里比如这样:int x=10;WriteData(&x,2);char *str="abcd";WriteData(&str,5);m_pData是目标位置,m_iWriteOffset是每次写入数据后长度的累加最后我取出m_pData只有第一个数据,后面写的不正常memcpy没有覆盖最初的,也没有把后面写入的data加到末尾不知道是那里出错了,还请知道的大神提点一下,不胜感激.额,上面举例那随手写的,有误,这里补充一下再封装两个用来写int和string的void WriteInt(int i){WriteData(&i,sizeof(int));}void WriteString(char *str){WriteData(str,strlen(str)+1);}写法就像这样int x=10;WriteInt(x);char *str="abcd";WriteString(str);问题应该不是语法错误,编译和运行的时候也没有报错就是不知道为什么后面str数据没有追加到m_pData里,得到的结果想是10abcd这种意思
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

可能错在了计算机存储机制上,
在32位系统的计算机中,每次变量的存储都是按以4的倍数位置开始的地址来存储的,
也就是说你新建一个变量,不管它是什么类型的,他都是从4的倍数位开始的。
虽然你这么存储是确实把内部东西都存储进去了,但是根据计算机的编码显示原因,
你直接看编译后产生的那些东西就是乱码的,或者不符合你要求的。
你可以对照原始存储进去的二进制码与原来的对比,应该是相同的。
而且int x=10; 这里的int应该是4个字节,WriteData(&x,2);应该是WriteData(&x,4);

查看完整回答
反对 回复 2022-03-23
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

你是如何看到数据没有被追加到m_pData里的?
按你第二种意思的话, int型数据要转为string型写入才能有10abcd这种效果:
void WriteInt(int i)
{
char tmp[20] = {0};
sprintf(tmp, "%d", i);
WriteData(tmp,strlen(tmp));//如果你是按字符串看m_pData的,这里就不是strlen(tmp)+1,否则要+1
}
WriteString也取决于你是按字符串方式看的还是按内存长度直接单个字符打出来的。相应应该没有“+1”和有“+1”



查看完整回答
反对 回复 2022-03-23
?
BIG阳

TA贡献1859条经验 获得超6个赞

void WriteData(void *data,int len)
{
char * newPos=m_pData+m_iWriteOffset;
memcpy(newPos,(char*)data,len);
m_iWriteOffset+=len;
}
上面这个函数只是为了能过多次调用WriteData来把一些数据写到m_pData里
比如这样:
int x=10;
WriteData(&x,2);
char *str="abcd";
WriteData(str,5);



查看完整回答
反对 回复 2022-03-23
  • 3 回答
  • 0 关注
  • 179 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信