为什么全局变量的数据在调用之后被改变了?

fatherofqiqi 2005-01-26 11:13:48
我在一个程序里定义了一个全局变量,BYTE temp[90];在一个子程序中,将它赋值;在另外的子程序中读取该数据。因为数据长度的原因,需要三次才能取走,使用
function(char * result, int i)
{
if (i==0)
{
memcpy(result,temp,30);
}
else if (i==1)
{
memcpy(result,temp+30,30);
}
else if (i==2)
{
memcpy(result,temp+60,30);
}
}
的方式运行,在运行时发现有时 temp 的数据到result拷贝错误,不知道什么原因?请高手指点。
...全文
500 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinxiaolin 2005-01-26
  • 打赏
  • 举报
回复
如果你是想将temp的数据分成3次赋值给result,
那在后2次调用memcpy(result,temp,30* sizeof(int))的时候应该将result指针移位;
memcpy(result+30,temp,30*sizeof(int));
memcpy(result+60,temp,30*sizeof(int));
最后如果你是给result动态分配内存的话,别忘了释放掉.
fatherofqiqi 2005-01-26
  • 打赏
  • 举报
回复
对。将temp的数据分成3次赋值给result。在VC6中,有时发现result的值全0。
shenailin 2005-01-26
  • 打赏
  • 举报
回复
不会有问题吧, result指针对吗?
qinxiaolin 2005-01-26
  • 打赏
  • 举报
回复
1.char * result;在memcpy(result,temp,30);之前你应该给result分配内存
result = new  char[90];

2.memcpy(result,temp,30);其中的30是代表30个字节,所以应该用 30*sizeof(int)来代替.
3.每次调用memcpy(result,temp,30);都会从result指向的第一个内存单元开始复制,所以,当
i =1;和i= 2时,调用memcpy(result,temp,30);都会将先前所复制的值覆盖掉.

你的意思还没有完全表达清楚.
TomDebug 2005-01-26
  • 打赏
  • 举报
回复
三次给result赋不同的值吗?
kobefly 2005-01-26
  • 打赏
  • 举报
回复
条件太少

不知道你怎么调用啊
fatherofqiqi 2005-01-26
  • 打赏
  • 举报
回复
感谢各位朋友帮助。在同事和自己的共同努力下解决了。大家知道,char数组的结尾以 0x00 为标志。在那个向 temp 赋值的函数中,会出现 0x00。但是他是 byte 类型的,同时,采用 memcpy 时,指针的方式可以越过0x00。但是 result 却按照 char 数组处理,结果自然错了,0x00后面的东西全完了。在子程序中加入了检测,去掉了 0x00,目前似乎好了。
me2love 2005-01-26
  • 打赏
  • 举报
回复
我想有可能由两个问题引起的,
一个是由于*result指针没有预设空间,所以可能被一些垃圾值占据;
另一种可能,是由于数组的结束符,即‘\0’或者是0x00引起的。
gnixemos 2005-01-26
  • 打赏
  • 举报
回复
理论上,该函数等同于如下表达式

memcpy(result,temp + i*30,30);
qinxiaolin 2005-01-26
  • 打赏
  • 举报
回复
还有一个问题是,result 是char*型,而temp是byte型的,
memcpy(result+30,temp,30*sizeof(int));中的,result+30的偏移量要计算正确,30*sizeof(int));
sizeof()里的参数也要用相应的类型代替.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧