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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UINT8    val_a;
. [2 X- k3 d2 \) SUINT16  val_b;! j+ Q2 j! G% I8 }( j9 v- Z
UINT8   a[2];
. t( G6 V$ }$ {+ D% N- i' F, K: B  gUINT8   b[4];
5 d+ E9 S2 j9 B7 MUINT8   s[10]="123456789";
2 p8 t+ y& B7 z4 r% b: Y2 w....
: g! y4 K' d- e# k# @: [mEMCpy(a,s,2);1 [. A/ N3 Q! P( w6 Y
memcpy(b,&s[2],4);% q" L# P& H# x8 E
val_a = stroul(a,0,16);  ///字符转化成长整形
( R* K" \" q3 w1 P$ bval_b = stroul(b,0,16);
% y3 y& l) k+ N2 R  Q9 r5 Z. `1 u( L# Qprintf("val_a=0x%02x",(short)val_a);
7 @3 w& M) K8 h6 h% F7 @" ?6 Xprintf("val_b=0x%02x",val_b);/ g! I4 G7 q: O3 C7 K# }* n
....
0 A( N% s+ S+ S) Y9 K( w9 r# x' d6 B
理论上应该得到的结果是:$ l6 n% V5 W" d8 j
val_a=0x12
- Q7 g" F# F3 q3 s2 Y% Pval_b=0x3456+ z. e- E7 ?2 f" d( N9 b! y

; D: e. F! h( }- ^( O4 L% H8 I1 x$ ]但是实际得到的结果却是
0 v& v2 b  a: n' t% f2 c& gval_a=0x560 j  z% b2 _5 z  j( _9 b
val_b=0x3456
! A) G- Q: T8 x& K3 m1 M9 ~2 t' {2 S

$ J+ }( g  h5 ]5 F) ^在vc6.0上得出的答案是正确的
( o  f4 S; c. B& t* O- O但是在我的8051单片机上得出的结果却是错误答案
+ {/ V, @: Y4 g  d9 I' c+ `: y: S; j  H+ b8 [
但是我将程序如下修改,可以得到正确答案
7 M, t) ?. v4 X! f" G, u3 Amemcpy(a,s,2);, T* }5 r0 F$ C: f, k; K( T: w  e
val_a = stroul(a,0,16);  ///字符转化成长整形" r5 X* c& s( ^0 [5 l1 M" L& N8 D
printf("val_a=0x%02x",(short)val_a);! o/ X( n1 T8 q/ W8 n7 t5 c5 `
memcpy(b,&s[2],4);; l/ a& [7 v: o' T
val_b = stroul(b,0,16);3 c& `1 Z, y* c' i  @+ k8 N9 O
printf("val_b=0x%02x",val_b);* Q9 ~. j3 h+ V

* d: M  v" l2 r0 y这样就可以得出原因就是被覆盖了,但是我不知道为什么会被覆盖,有人跟我说明显会被覆盖的,但是我真心不知道,为毛$ A  }5 _) L! h) P; h

: A  _: H2 e7 K( {  v% j

该用户从未签到

2#
 楼主| 发表于 2013-9-13 18:47 | 只看该作者
UINT8是unsigned char7 f5 D. E' H( _
UINT16是unsigned char short

该用户从未签到

3#
发表于 2013-10-8 14:12 | 只看该作者
stroul函数,我没有查到,是将字符串转成长整形吗?2 A! r% a7 o8 |- m
uint8 a[2]; 改成 uint8 a[3] = {0};5 Z3 n' d: I; p' y8 c7 D
uint8 b[4]; 改成 uint8 b[5] = {0};; D0 ~& V; k- P/ K, C
字符串应该以0结束。

该用户从未签到

4#
 楼主| 发表于 2013-10-9 09:13 | 只看该作者
ArthurGXH 发表于 2013-10-8 14:12; }0 D1 n; {; |# f
stroul函数,我没有查到,是将字符串转成长整形吗?! s* ~/ M$ z5 s
uint8 a[2]; 改成 uint8 a[3] = {0};7 P/ k, R2 r0 ~; F) C1 f
uint8 b[4]; 改 ...
) `  H8 t. w7 ^% Z# ?: n- P
还是一样错误,val_a错误

该用户从未签到

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

该用户从未签到

6#
 楼主| 发表于 2013-10-10 08:51 | 只看该作者
ArthurGXH 发表于 2013-10-9 22:03
4 j7 w* W" k# p& i8 z) U把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。

+ q- b) |: K  L' f5 n" R' I1 S这是库函数,转换数据类型的,你百科下就知道了

该用户从未签到

7#
发表于 2013-10-10 14:32 | 只看该作者
本帖最后由 ArthurGXH 于 2013-10-10 14:36 编辑
8 p6 y! l# R  X3 O+ r7 `) t! u* a+ w5 Z# b& J$ @: ?" r
楼主的函数写错了,应该是strtol。
5 A; l6 J+ h. O3 ~3 S( W5 P* e# j楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}”。这个程序我试过,按我说的改就没问题。原因太简单,在3楼已经解释了,你仔细想想。

该用户从未签到

8#
 楼主| 发表于 2013-10-11 13:00 | 只看该作者
ArthurGXH 发表于 2013-10-10 14:32
7 a- P( V2 m& a) r# \; {8 x楼主的函数写错了,应该是strtol。
- j0 P/ D9 G% z楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}” ...
$ \1 l2 s( x3 e- w0 _: M5 [5 G7 t- S
% v2 g1 G/ f1 T* Z: u
ab长度是增加了,因为我存放字符,这个貌似对我这个没多大影响吧?求解
; F) u# S" u! d- r) Y4 [1 o+ i
% E; s" h3 n3 Q3 {/ w$ j恩,查了下:0 O" c8 ~  m( Q
strtoul(将字符串转换成无符号长整型数)% n7 Z' b! z" |; g8 N7 S# x& E% B+ Z
strtol    (将参数nptr字符串根据参数base来转换成长整型数)
0 ~3 c+ D8 ?& x- B  s4 l
# B) ^" a% f1 R- `6 R- h功能差不多,上面是转换成无符号整形,故有个u: J7 s2 _6 I5 ~
! @- A- }: s4 v3 N- v
+ i. Y' F: z% K0 r6 _" v
+ N0 S' |9 G  Q9 X7 Y2 ~# R
9 A  y3 R6 w# G8 c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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