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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UINT8    val_a;
: D8 H  q$ G8 @# Z% nUINT16  val_b;
. f: ^5 S8 S3 H5 p7 Y" O3 H% g2 ^UINT8   a[2];& W4 k, c) ?9 Y5 t" u8 N
UINT8   b[4];  O0 {5 `- @1 k/ r5 }& v) m; \' k! G
UINT8   s[10]="123456789";
/ w; Y$ l: P0 I4 Q- A....2 @- v' X2 I7 F4 r3 i0 ]  H* N( F
mEMCpy(a,s,2);6 T; [" L8 e! A  z
memcpy(b,&s[2],4);; P* v5 v" E2 D& }8 r1 C" l
val_a = stroul(a,0,16);  ///字符转化成长整形% |/ k2 L. o/ U* }
val_b = stroul(b,0,16);
4 {# Z5 d! ~, _, I' T8 t& jprintf("val_a=0x%02x",(short)val_a);0 q2 q. Q, @! ^0 i" l
printf("val_b=0x%02x",val_b);, A5 `$ L( }4 Q
....
* q. [+ N2 e" L/ U# W# ^  K$ a, J, M6 T$ x0 M) |! x
理论上应该得到的结果是:
& w3 X  Y' B1 N. [3 _- T/ `9 Fval_a=0x12
0 N2 p4 P' r4 Q' Fval_b=0x34563 F* c2 l* T+ B. K. K8 X# @$ v" h

/ K; ]; R) h, |6 B- R0 j+ o6 t0 M3 ?但是实际得到的结果却是
/ P  w9 C5 k4 g' Z8 W! Pval_a=0x567 u5 m, Q+ A. Z' X  a0 B; e
val_b=0x34563 z2 O1 G' b3 h% k# ?% j
% \1 Q8 B) J' E% ^0 J3 o7 R/ q
; `' W8 @: u; w" o" p2 G
在vc6.0上得出的答案是正确的, p; m4 E6 a8 b0 Q5 x4 {' J9 [
但是在我的8051单片机上得出的结果却是错误答案& Z+ x, b. ~) v: w8 K( y3 N( u

( @1 i$ D* d6 V) N: P但是我将程序如下修改,可以得到正确答案
6 ?7 G$ P. |- M# Ememcpy(a,s,2);/ q- I2 Z( p# Y' y8 |3 k* }
val_a = stroul(a,0,16);  ///字符转化成长整形2 n& b; o% O5 y$ H
printf("val_a=0x%02x",(short)val_a);
8 I" i1 I3 n- @memcpy(b,&s[2],4);+ L# e6 y. Z) }2 i1 X
val_b = stroul(b,0,16);
  v+ X6 V5 }& s8 F# s& lprintf("val_b=0x%02x",val_b);
+ p- x. a% X' @$ ^$ U
) E* [9 O0 b2 d9 Q: h这样就可以得出原因就是被覆盖了,但是我不知道为什么会被覆盖,有人跟我说明显会被覆盖的,但是我真心不知道,为毛
7 k: Y+ w, `0 B$ ~0 V0 |
7 ^, `5 j. m* T% f  Y1 o6 _9 H

该用户从未签到

2#
 楼主| 发表于 2013-9-13 18:47 | 只看该作者
UINT8是unsigned char1 J7 ?* u5 u, `6 V9 z
UINT16是unsigned char short

该用户从未签到

3#
发表于 2013-10-8 14:12 | 只看该作者
stroul函数,我没有查到,是将字符串转成长整形吗?. y) A2 }7 V- t. j* q" T
uint8 a[2]; 改成 uint8 a[3] = {0};0 ^# J# h0 s* x  j4 b1 e, n8 ^) y
uint8 b[4]; 改成 uint8 b[5] = {0};
. h: S/ v7 F% E3 \2 |字符串应该以0结束。

该用户从未签到

4#
 楼主| 发表于 2013-10-9 09:13 | 只看该作者
ArthurGXH 发表于 2013-10-8 14:12) a3 b" l# B4 w2 F7 ~
stroul函数,我没有查到,是将字符串转成长整形吗?
7 A0 W3 E0 Z  y( x! huint8 a[2]; 改成 uint8 a[3] = {0};
$ y/ ]; h- @) T( J1 u/ Wuint8 b[4]; 改 ...

+ {' Z4 q5 T, K0 v还是一样错误,val_a错误

该用户从未签到

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

该用户从未签到

6#
 楼主| 发表于 2013-10-10 08:51 | 只看该作者
ArthurGXH 发表于 2013-10-9 22:03* z8 R* y3 ^) Z# g( |/ }' X: S
把stroul函数贴出来吧,调试程序最好用断点查看变量的值,而不是用printf函数。
& T$ ^3 K  M7 q  d/ t7 W
这是库函数,转换数据类型的,你百科下就知道了

该用户从未签到

7#
发表于 2013-10-10 14:32 | 只看该作者
本帖最后由 ArthurGXH 于 2013-10-10 14:36 编辑 3 O2 h: M5 j9 \( u' L3 ^. o
3 M9 J1 a; Y9 F4 X" o6 p
楼主的函数写错了,应该是strtol。
* z. X5 `8 h! y# L1 D$ _楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}”。这个程序我试过,按我说的改就没问题。原因太简单,在3楼已经解释了,你仔细想想。

该用户从未签到

8#
 楼主| 发表于 2013-10-11 13:00 | 只看该作者
ArthurGXH 发表于 2013-10-10 14:32
  n" _4 v7 Q' f2 a+ q楼主的函数写错了,应该是strtol。- B  ^0 P9 R7 t- {" y& G6 |
楼主仔细看我在3楼的回帖,数组a、b的长度都增加了1,且加了“={0}” ...
- I6 b+ {+ O+ M& R

8 M! \' N! z5 `0 o0 aab长度是增加了,因为我存放字符,这个貌似对我这个没多大影响吧?求解8 l7 v2 H( ^2 G+ \% j
8 K. ]% e! j7 ]  Y1 A
恩,查了下:- ?9 m$ t. v2 I& Z7 [7 Z; D9 o
strtoul(将字符串转换成无符号长整型数)! c- o' C+ P8 U2 m9 m' n0 x2 O
strtol    (将参数nptr字符串根据参数base来转换成长整型数): I8 b$ O# P  l1 Q, s3 a9 n

& e* [$ }' E' Q+ _* z$ d功能差不多,上面是转换成无符号整形,故有个u
1 ]9 O3 x* B8 r+ D2 W$ K  A  n6 U$ [; G) ^" z

1 O5 K+ u1 f3 W" E* ]0 C4 \& \/ E0 v7 [$ W+ H! k

& I/ B- {8 b* G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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