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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UINT8    val_a;3 V0 v$ J. y3 N, p" f1 q$ _
UINT16  val_b;  k1 f5 c0 p; o4 @8 X# ^! R' z
UINT8   a[2];
# [- ?- x- z2 a' \3 e+ dUINT8   b[4];
( C. ]+ _* G) }8 x1 }/ ]: S& SUINT8   s[10]="123456789";
- E' o- S) D1 h: |2 Z. w...." S2 D  g7 ~. r. ~% I& W
mEMCpy(a,s,2);
, t6 Q5 \, L1 A( r: i# V5 ^) M( p; Xmemcpy(b,&s[2],4);/ ~" o, j, o; B& |& A3 H- F! ]9 ?
val_a = stroul(a,0,16);  ///字符转化成长整形
0 T$ I: S+ T1 {' j& ]5 i( h2 uval_b = stroul(b,0,16);
- @6 |& v0 r2 o% Y( q) D7 B( lprintf("val_a=0x%02x",(short)val_a);
0 ?3 K8 t/ K' u& B: o3 h. jprintf("val_b=0x%02x",val_b);
, K7 T- H: u: a: S$ E# Q" m( k2 Z$ o....+ z! X, E: O3 D
, o3 m# n: h0 H
理论上应该得到的结果是:
  Z% [6 s1 L, N: D" ival_a=0x120 v! b9 h- H' Z/ X3 M
val_b=0x3456  {3 _+ L3 [8 E! [

3 J) h8 ?# c4 R9 }5 Z但是实际得到的结果却是
* J  K# ^) ^/ t* Y0 [: {4 Nval_a=0x563 ~3 _! P& p/ Q4 o4 V  V/ L8 H
val_b=0x3456
; M2 ^& e" X! w, n6 P8 q4 C
6 |, }3 T9 B! q% \+ K2 @  H6 X: t& P! V# k1 i
在vc6.0上得出的答案是正确的+ p4 \. t" x1 f1 T
但是在我的8051单片机上得出的结果却是错误答案& R1 q' o0 g( g: \. k
  R4 {$ N0 b9 A& h. e$ Y) n
但是我将程序如下修改,可以得到正确答案6 L* Y9 v6 V  W5 c- c" V& Q1 v
memcpy(a,s,2);+ W" M' M! P5 T
val_a = stroul(a,0,16);  ///字符转化成长整形
# ^9 ^. Q+ }0 p$ Q& S! Wprintf("val_a=0x%02x",(short)val_a);
+ E( t0 i1 b) Q, ]2 G& O3 zmemcpy(b,&s[2],4);
4 L5 K9 L9 X! p. R# \val_b = stroul(b,0,16);
7 S, {: V% }; zprintf("val_b=0x%02x",val_b);3 j. v& x+ n5 a! S, R- F
5 J2 H) E' E1 Z0 m/ e
这样就可以得出原因就是被覆盖了,但是我不知道为什么会被覆盖,有人跟我说明显会被覆盖的,但是我真心不知道,为毛' |! U8 r& R/ k& r6 a
) Z$ B. y" d# s+ u/ Q

该用户从未签到

2#
 楼主| 发表于 2013-9-13 18:47 | 只看该作者
UINT8是unsigned char+ y! V8 y+ E& k: X
UINT16是unsigned char short

该用户从未签到

3#
发表于 2013-10-8 14:12 | 只看该作者
stroul函数,我没有查到,是将字符串转成长整形吗?
# h. ~1 ^9 }: v) r5 ruint8 a[2]; 改成 uint8 a[3] = {0};3 ?; L% f. m( b
uint8 b[4]; 改成 uint8 b[5] = {0};
- e1 H+ Q1 |5 A. i" N字符串应该以0结束。

该用户从未签到

4#
 楼主| 发表于 2013-10-9 09:13 | 只看该作者
ArthurGXH 发表于 2013-10-8 14:12
! u' A2 o- B$ T( [stroul函数,我没有查到,是将字符串转成长整形吗?1 ^3 i' F9 z* `) v4 Q0 [
uint8 a[2]; 改成 uint8 a[3] = {0};1 j' R) G  k; M  f; T1 F
uint8 b[4]; 改 ...

9 l; A0 C, V7 W还是一样错误,val_a错误

该用户从未签到

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

该用户从未签到

6#
 楼主| 发表于 2013-10-10 08:51 | 只看该作者
ArthurGXH 发表于 2013-10-9 22:03+ J1 o" R- b) M/ k/ }
把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。

) l" q5 j  _, K这是库函数,转换数据类型的,你百科下就知道了

该用户从未签到

7#
发表于 2013-10-10 14:32 | 只看该作者
本帖最后由 ArthurGXH 于 2013-10-10 14:36 编辑
2 A4 Z( H3 {) z; T6 E; d
! c0 }6 c% n) n8 c' h楼主的函数写错了,应该是strtol。+ u& B9 I6 ?, l. c1 C
楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}”。这个程序我试过,按我说的改就没问题。原因太简单,在3楼已经解释了,你仔细想想。

该用户从未签到

8#
 楼主| 发表于 2013-10-11 13:00 | 只看该作者
ArthurGXH 发表于 2013-10-10 14:32$ ^+ i0 p& R9 ^3 h1 Y# s
楼主的函数写错了,应该是strtol。
( f/ n+ `6 ^: d0 J$ ^楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}” ...
+ P8 H+ {3 h0 B2 N
- ?7 s+ ?# w6 @( T3 H
ab长度是增加了,因为我存放字符,这个貌似对我这个没多大影响吧?求解' G  |3 Q5 W) V" K/ g2 i
- v& y* C) V4 D* v0 Q
恩,查了下:  s( W" W% C4 v
strtoul(将字符串转换成无符号长整型数)
$ n& G  T) ]& x* N' Jstrtol    (将参数nptr字符串根据参数base来转换成长整型数)
: O4 f' I: V% u# M/ t6 N. Y6 h: I3 q! S0 {% ~, X
功能差不多,上面是转换成无符号整形,故有个u
) @* C# P/ Z' e# t. i. g- t9 @& q" x/ f2 B2 V4 Y# A0 g; e
. T/ Y8 H: A* O4 \8 B8 I

0 f$ y. g4 S/ c# E6 ]
2 K* t, o& T/ Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 18:26 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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