找回密码
 注册
关于网站域名变更的通知
查看: 1166|回复: 7
打印 上一主题 下一主题

copy数据出现覆盖,神马问题?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2013-9-13 18:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
UINT8    val_a;1 g% \% r$ A0 U: i0 M* |" ^1 X
UINT16  val_b;  p$ p1 }% Q; K6 M7 c
UINT8   a[2];
6 Q% [+ v  }$ e4 Q: lUINT8   b[4];
8 u. U( P" l3 O) b8 DUINT8   s[10]="123456789";9 Z9 G% }" g. c- W$ T& X
...." q) S) W. ~7 o
mEMCpy(a,s,2);& ^+ ?( ?9 H( Y6 G4 v; f% X
memcpy(b,&s[2],4);6 I- s1 y& T5 F5 }
val_a = stroul(a,0,16);  ///字符转化成长整形
# |. O% m! w! h( I# D; d) K3 gval_b = stroul(b,0,16);
; K! F  v$ y( tprintf("val_a=0x%02x",(short)val_a);+ @; y' C" W( S0 c9 K
printf("val_b=0x%02x",val_b);* ?7 A* r9 Q. x, v) M
....
& G7 g9 \, z) Y& L
3 U  p6 I4 ?; G8 f4 w+ A理论上应该得到的结果是:
* [" V- M$ l; l0 v% P; Hval_a=0x127 z' v1 F% R! y, y. A* _
val_b=0x3456+ K  p/ I) G# y" F
, e* ]. o7 q& g6 M9 s+ @. J* J
但是实际得到的结果却是  L2 _+ r1 B8 S) S
val_a=0x56
8 D$ G" m. O9 {* i1 `0 Q  Eval_b=0x3456( V3 r, P9 }% J  _0 g7 m
2 r8 O+ E2 d1 w
- k0 v) h5 X. W( G2 F8 h/ i; A: ]' N
在vc6.0上得出的答案是正确的
3 y/ l5 J' ?2 J& [/ y- D但是在我的8051单片机上得出的结果却是错误答案
4 x9 r2 p6 g" {* J2 {9 f7 u3 Y! k4 ]- M
但是我将程序如下修改,可以得到正确答案  b; f: X0 T) m( h3 N
memcpy(a,s,2);, C0 u4 E& u  o5 C+ ?( p7 j
val_a = stroul(a,0,16);  ///字符转化成长整形
- m6 Y7 |7 D" |& z6 O" m; P& Kprintf("val_a=0x%02x",(short)val_a);/ l0 O# [3 x3 T2 A3 x) [
memcpy(b,&s[2],4);& X/ T. ?& h( c" h2 g
val_b = stroul(b,0,16);
+ T& I- W7 }+ S4 z  z' r" sprintf("val_b=0x%02x",val_b);# q" l# h' h$ }$ w! p

4 }/ S3 T8 s" s这样就可以得出原因就是被覆盖了,但是我不知道为什么会被覆盖,有人跟我说明显会被覆盖的,但是我真心不知道,为毛# b' u1 T$ m: N! S1 Z& `8 I

, l0 s9 `2 r& ~# A" I0 \0 u6 J

该用户从未签到

2#
 楼主| 发表于 2013-9-13 18:47 | 只看该作者
UINT8是unsigned char
, \5 v$ x2 V* L3 S" FUINT16是unsigned char short

该用户从未签到

3#
发表于 2013-10-8 14:12 | 只看该作者
stroul函数,我没有查到,是将字符串转成长整形吗?$ O" ~% j' M* Y) g! Y& Q
uint8 a[2]; 改成 uint8 a[3] = {0};
' n% J. X6 z. g, w, Buint8 b[4]; 改成 uint8 b[5] = {0};$ L  `% I5 V1 w
字符串应该以0结束。

该用户从未签到

4#
 楼主| 发表于 2013-10-9 09:13 | 只看该作者
ArthurGXH 发表于 2013-10-8 14:12
$ @6 o6 c* q2 P9 a8 U3 K5 W/ sstroul函数,我没有查到,是将字符串转成长整形吗?& \7 @* @2 ?5 y2 ?( r+ D& O
uint8 a[2]; 改成 uint8 a[3] = {0};
& T* H! X2 m! |6 Y! G8 Buint8 b[4]; 改 ...
1 H, U0 [6 \6 I5 b8 b# \, j
还是一样错误,val_a错误

该用户从未签到

5#
发表于 2013-10-9 22:03 | 只看该作者
把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。

该用户从未签到

6#
 楼主| 发表于 2013-10-10 08:51 | 只看该作者
ArthurGXH 发表于 2013-10-9 22:03+ P* i& h$ H; z: i+ a) S7 U. D7 G
把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。

  a$ k9 X0 [: |. J! A这是库函数,转换数据类型的,你百科下就知道了

该用户从未签到

7#
发表于 2013-10-10 14:32 | 只看该作者
本帖最后由 ArthurGXH 于 2013-10-10 14:36 编辑 5 ~8 j+ O4 U0 C) M

  s" l0 J) C+ Q& t" W5 Z楼主的函数写错了,应该是strtol。4 @( v8 m. y6 ]3 u, F
楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}”。这个程序我试过,按我说的改就没问题。原因太简单,在3楼已经解释了,你仔细想想。

该用户从未签到

8#
 楼主| 发表于 2013-10-11 13:00 | 只看该作者
ArthurGXH 发表于 2013-10-10 14:32
2 V$ q" r4 T& b7 Y- E8 y) D楼主的函数写错了,应该是strtol。
8 c! k5 G1 k2 b楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}” ...

5 S) Z- r# u' P; q/ A4 E2 [7 s$ r9 l  x. a) \
ab长度是增加了,因为我存放字符,这个貌似对我这个没多大影响吧?求解
* |! ]; V0 a# V% Q- L; V$ p2 H* s- T1 W9 C, L# o& e
恩,查了下:
# h( p3 ]" l1 x' m& Astrtoul(将字符串转换成无符号长整型数)0 |5 G' k3 ~4 {4 M
strtol    (将参数nptr字符串根据参数base来转换成长整型数)+ W' ~' f% V& m; t$ g6 e9 V1 M
# L8 K" Q: t$ [* f' L
功能差不多,上面是转换成无符号整形,故有个u
# w' A! \0 k& M0 S) s, y& l' G2 a4 S% w, e* u  j  r

$ b' Y  p* }* v% p$ H6 @$ E7 T' P# N9 I" P
% d7 `# j0 }8 |' O. f
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-20 14:09 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表