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

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这种意思

小怪兽爱吃肉
浏览 180回答 3
3回答

潇湘沐

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

慕尼黑的夜晚无繁华

你是如何看到数据没有被追加到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”

BIG阳

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);
打开App,查看更多内容
随时随地看视频慕课网APP