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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UINT8    val_a;
- g/ I) @/ \7 D* ]' uUINT16  val_b;9 D; E% X" u, e
UINT8   a[2];* p% p9 M  ]5 b# \0 G, o$ k. Y
UINT8   b[4];; I' X1 r9 |2 s8 U2 k4 [& Y
UINT8   s[10]="123456789";* |. r* |- k+ c' X
....8 x' J& C7 m1 f
mEMCpy(a,s,2);/ \" l! E9 J7 ?: S$ W% @
memcpy(b,&s[2],4);2 e7 ?6 F& S- y9 }) ~- H4 \3 q
val_a = stroul(a,0,16);  ///字符转化成长整形
8 a  d( i' f6 U+ cval_b = stroul(b,0,16);
( _  z& H) S8 I8 \  i+ _7 Bprintf("val_a=0x%02x",(short)val_a);
+ E6 H0 G3 P+ T2 [7 b* w! nprintf("val_b=0x%02x",val_b);
) L7 ~+ X5 U* U....
; f' P2 ^* Z* B' u3 v, Y2 V* b1 ~1 E/ S) [0 C
理论上应该得到的结果是:& m. N/ W+ Q# |
val_a=0x128 f0 P5 }/ l+ f/ j1 I1 c' ]
val_b=0x3456
) D& E$ q2 p7 ~3 [* \) f6 ]* j, |7 N1 y; `, l
但是实际得到的结果却是/ E- o/ [6 }$ h6 k
val_a=0x56& u( I1 I. w' I5 o4 m
val_b=0x3456' M2 }  T9 G. A) I, d7 ~: a
/ S+ j) {- K' [! T% F

, d" F) ]; F. @在vc6.0上得出的答案是正确的; J% j, i% X! f
但是在我的8051单片机上得出的结果却是错误答案
5 r8 V9 c- [( R8 p( l& Z+ c+ Y" _5 B+ i  J
但是我将程序如下修改,可以得到正确答案$ r5 X% u* n- O/ \$ [4 E( b- @. R+ d
memcpy(a,s,2);
2 u$ N9 A& R: t- m/ [4 ]val_a = stroul(a,0,16);  ///字符转化成长整形
- l4 @8 X7 H; {$ }6 vprintf("val_a=0x%02x",(short)val_a);9 _% v1 [) f3 ]" ^% O# r7 G/ ]
memcpy(b,&s[2],4);8 W# {$ ]4 u( _. w/ ]
val_b = stroul(b,0,16);
2 [7 H# C% l0 W. P$ D& W* [0 Oprintf("val_b=0x%02x",val_b);
* {' u" L. ^2 ~! L) m1 U5 {  k+ b4 O# Q
这样就可以得出原因就是被覆盖了,但是我不知道为什么会被覆盖,有人跟我说明显会被覆盖的,但是我真心不知道,为毛( m* x: k+ K  v' I
/ I$ o9 r+ A+ `/ M

该用户从未签到

8#
 楼主| 发表于 2013-10-11 13:00 | 只看该作者
ArthurGXH 发表于 2013-10-10 14:32+ Q7 s0 `6 ]4 d" D4 {. M6 r
楼主的函数写错了,应该是strtol。* F6 o' t: ]$ r1 [! q% ]2 u
楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}” ...
. x* Q" q6 f4 S9 p" l4 i1 D5 }# T
5 J% J' Q6 o! N
ab长度是增加了,因为我存放字符,这个貌似对我这个没多大影响吧?求解$ e# K( P& J# j' q# ]
1 e: b2 D3 c/ |2 N, w; \
恩,查了下:! q2 n: ~' c' L6 r
strtoul(将字符串转换成无符号长整型数)
0 i$ r! ~6 S. ~. ]* K! H/ c3 wstrtol    (将参数nptr字符串根据参数base来转换成长整型数)
7 J; }- x( H& J7 n& A  P  ~, t. Q6 F' ]0 a# `- _: Z# {
功能差不多,上面是转换成无符号整形,故有个u) K9 b' q; d4 m& Z+ H6 D

4 l2 ^" p9 e5 |3 y5 c( n8 Z0 `8 N& g  B; h7 j# w
  a0 _) {8 s" R# w8 u$ `
2 A; L' o" k5 {0 O3 @) Z8 c. ^

该用户从未签到

7#
发表于 2013-10-10 14:32 | 只看该作者
本帖最后由 ArthurGXH 于 2013-10-10 14:36 编辑 7 z& p  c. z3 C$ w

/ G' L( Z* F1 l楼主的函数写错了,应该是strtol。
* J5 @* M  o% V. \3 u2 h# P楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}”。这个程序我试过,按我说的改就没问题。原因太简单,在3楼已经解释了,你仔细想想。

该用户从未签到

6#
 楼主| 发表于 2013-10-10 08:51 | 只看该作者
ArthurGXH 发表于 2013-10-9 22:03
- Y" x9 S- ]4 o6 y# @* H; _& u把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。
" b. v$ b$ E% x; \0 u
这是库函数,转换数据类型的,你百科下就知道了

该用户从未签到

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

该用户从未签到

4#
 楼主| 发表于 2013-10-9 09:13 | 只看该作者
ArthurGXH 发表于 2013-10-8 14:12- C4 S& q: U" f/ K
stroul函数,我没有查到,是将字符串转成长整形吗?. U3 P, y+ R  U. _. o4 Q* o
uint8 a[2]; 改成 uint8 a[3] = {0};
( x# t' ~5 A( ruint8 b[4]; 改 ...
  D/ C$ v# k' E* |
还是一样错误,val_a错误

该用户从未签到

3#
发表于 2013-10-8 14:12 | 只看该作者
stroul函数,我没有查到,是将字符串转成长整形吗?
9 I* P/ B, l4 c$ f0 Guint8 a[2]; 改成 uint8 a[3] = {0};- y8 h" u% W, ?' W% c- W
uint8 b[4]; 改成 uint8 b[5] = {0};
1 C& w5 @" \6 _% j5 w. W字符串应该以0结束。

该用户从未签到

2#
 楼主| 发表于 2013-9-13 18:47 | 只看该作者
UINT8是unsigned char- _! t9 P  A$ J8 J
UINT16是unsigned char short
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 17:25 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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