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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UINT8    val_a;* T# ]! \6 T+ ^4 u4 k7 d6 \( B8 v% N- k
UINT16  val_b;
0 K* V. f+ q4 v3 {% q" i4 e- wUINT8   a[2];
* L* o' K5 `! v- y2 I5 s6 LUINT8   b[4];+ r- T# D7 x% g
UINT8   s[10]="123456789";3 u1 _; `, d' G& z0 L8 P8 X) l# K4 k
....+ E3 ^# K0 ?$ H/ }! y! ^0 h
mEMCpy(a,s,2);0 K# G: k* O& J7 c7 C; T* v
memcpy(b,&s[2],4);
1 y( S- ~- ~& g* I! \( D" @0 i3 vval_a = stroul(a,0,16);  ///字符转化成长整形5 P5 B: E4 a+ w  s' S) @
val_b = stroul(b,0,16);/ o4 h9 X! _$ P. X) U! x- ^3 }
printf("val_a=0x%02x",(short)val_a);: X8 ?  Q, _; r
printf("val_b=0x%02x",val_b);! ^% U8 Y& ?2 p3 d- A7 r
....1 a7 l% K# @4 ~' [% _( |6 R

) Y- D4 b7 f6 q  ?  c& r理论上应该得到的结果是:
* ]* b# b4 ]9 L$ s  Fval_a=0x12' N6 i6 E% m: B2 C. o* B
val_b=0x3456
& N, P  i7 X' Z+ G7 R! p
  q; u# k3 I8 g% r5 I- r6 ?* i但是实际得到的结果却是2 z- `* Q( O  p/ I8 m* U5 `
val_a=0x56
9 y0 d2 y5 H, |# Q7 \val_b=0x3456, \  \; K/ y/ v6 x& t  F

8 e  `9 B9 P6 S( [1 C# Z( ^" Y
/ i1 Z, I3 P+ G! J# d  U" P在vc6.0上得出的答案是正确的- E5 Q& z5 b; s* J' q; C; U
但是在我的8051单片机上得出的结果却是错误答案2 c  ?; y; S& o; v( m
9 Y+ D5 I+ i; i
但是我将程序如下修改,可以得到正确答案$ _9 X  y$ V: ]; l
memcpy(a,s,2);
+ _( y4 H. ^' }/ Oval_a = stroul(a,0,16);  ///字符转化成长整形
' s4 S. j, {" {printf("val_a=0x%02x",(short)val_a);
7 z0 z" J# @; w7 [4 Ememcpy(b,&s[2],4);; J! y& a2 x7 @
val_b = stroul(b,0,16);% n" x! K$ e# Y! H8 y/ B+ m# a! J
printf("val_b=0x%02x",val_b);
- ?8 l1 @/ h! ^6 Q5 z  \/ \* O5 h4 P' K1 j! O1 F9 |$ ^* f+ _
这样就可以得出原因就是被覆盖了,但是我不知道为什么会被覆盖,有人跟我说明显会被覆盖的,但是我真心不知道,为毛4 J$ s# U2 J. C* y9 |9 L

2 X, R, l! s  c

该用户从未签到

2#
 楼主| 发表于 2013-9-13 18:47 | 只看该作者
UINT8是unsigned char
, y) L' b+ ^: t7 c! n; ^UINT16是unsigned char short

该用户从未签到

3#
发表于 2013-10-8 14:12 | 只看该作者
stroul函数,我没有查到,是将字符串转成长整形吗?
% L3 ~- s8 j4 R5 j) g% Tuint8 a[2]; 改成 uint8 a[3] = {0};
: B' r2 h' b, N/ }uint8 b[4]; 改成 uint8 b[5] = {0};
5 H+ ]  n) j& S. B  r% S字符串应该以0结束。

该用户从未签到

4#
 楼主| 发表于 2013-10-9 09:13 | 只看该作者
ArthurGXH 发表于 2013-10-8 14:120 ~( c6 A" M" |' _, E( C0 t# n, P
stroul函数,我没有查到,是将字符串转成长整形吗?9 u0 I. T  q( c) E; [
uint8 a[2]; 改成 uint8 a[3] = {0};- @  J. |5 S  F
uint8 b[4]; 改 ...
' P) {& ~* t6 n+ g
还是一样错误,val_a错误

该用户从未签到

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

该用户从未签到

6#
 楼主| 发表于 2013-10-10 08:51 | 只看该作者
ArthurGXH 发表于 2013-10-9 22:03( U) c1 q4 F" `: x# X5 i9 X
把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。

5 \- G: w' j# D$ n" R这是库函数,转换数据类型的,你百科下就知道了

该用户从未签到

7#
发表于 2013-10-10 14:32 | 只看该作者
本帖最后由 ArthurGXH 于 2013-10-10 14:36 编辑
. c2 i8 {% s. V) \. N( Y, g" {( A* G# W; @: t/ G
楼主的函数写错了,应该是strtol。0 ^/ R: Z+ s0 s& U
楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}”。这个程序我试过,按我说的改就没问题。原因太简单,在3楼已经解释了,你仔细想想。

该用户从未签到

8#
 楼主| 发表于 2013-10-11 13:00 | 只看该作者
ArthurGXH 发表于 2013-10-10 14:329 S2 r/ V' ?2 F" o
楼主的函数写错了,应该是strtol。
& ]5 i" u$ @. d/ C/ }  c楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}” ...
& e5 w) f9 a9 @8 o4 J1 D7 I
" K) g$ Z9 w5 Q# d; J8 q
ab长度是增加了,因为我存放字符,这个貌似对我这个没多大影响吧?求解
+ e/ O( w3 W2 y6 b9 P4 R0 N
8 m3 r: B1 f- X% R, \  T) F恩,查了下:4 ^5 [1 S- }3 ~/ M5 L1 ^3 V, R8 Z# m
strtoul(将字符串转换成无符号长整型数)) G9 d2 j) [- }. |5 F
strtol    (将参数nptr字符串根据参数base来转换成长整型数)
! }6 j8 E# U2 M0 s
4 D7 k9 ?7 O; b& T8 K+ i. [1 f功能差不多,上面是转换成无符号整形,故有个u' r4 W! u( r$ e7 |3 o3 a8 b

( \* N/ R. S% L  `# @- ~/ j2 v2 [) ?% m) H: |

% k% H2 @, v& @8 i- J/ J9 K# L/ I; e6 H! V' G- c. g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-5 05:51 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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