WinCE下指针取值问题

mynews237 2016-12-26 10:05:35
我写了个测试程序,在VC下可以执行,但是用2440的sdk、VS2005和WINCE6.0的模拟器,单步执行到a = *p; 执行到这里,就不往下执行了,请教大家一下。

void CTest5Dlg::OnTest()
{
unsigned char *buf;
unsigned long a;
unsigned long *p;
int i;
CString s;
buf = (unsigned char *)malloc(100);
for (i=0;i<100;i++)
{
buf[i] = i;
}
p = (unsigned long *)(buf+1);
a = *p; // 执行到这里,就不往下执行了
s.Format(_T("a = 0x%08X"), a);
AfxMessageBox(s);
}
...全文
3251 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kindowstt 2016-12-30
  • 打赏
  • 举报
回复
因为程序执行到 p = (unsigned long *)(buf+1); 这时p=0;也就指针p=NULL 你可以直接令p=NULL,一样的结果。
curious_cat 2016-12-30
  • 打赏
  • 举报
回复
一些处理器平台(ARM, MIPS)有数据对齐要求: 半字(halfword, 16-bit)数据的地址必须为2的整倍数; 字(word, 32-bit)数据的地址必须为4的整倍数; 如果没有满足该要求,在访问这些数据的时候会导致处理器异常。 和C/C++编程对应的是:编程时遇到强制指针类型转换,特别小心,一不小心就会中招。 你的程序非常明显的是犯了这个错误。
  • 打赏
  • 举报
回复
ARM的对齐问题很蛋疼啊~~
mynews237 2016-12-27
  • 打赏
  • 举报
回复
引用 9 楼 mynews237 的回复:
[quote=引用 8 楼 accessysq 的回复:] 或者你用memcpy也行。
我现在也是使用的memcpy来解决的该问题。就是想知道,为什么WINCE下这种操作会出问题,不知道程序还有哪些隐患。[/quote]
引用 9 楼 mynews237 的回复:
[quote=引用 8 楼 accessysq 的回复:] 或者你用memcpy也行。
我现在也是使用的memcpy来解决的该问题。就是想知道,为什么WINCE下这种操作会出问题,不知道程序还有哪些隐患。[/quote] 感谢仁兄的提示,我又做了测试,感觉确实是字节对齐的问题,如果取的是p = (unsigned long *)(buf+i*4);a = *p;即相对buf的偏移量是4的倍数,就可以取值,如果不是,就会出现错误!谢谢大家!!!
mynews237 2016-12-27
  • 打赏
  • 举报
回复
引用 8 楼 accessysq 的回复:
或者你用memcpy也行。
我现在也是使用的memcpy来解决的该问题。就是想知道,为什么WINCE下这种操作会出问题,不知道程序还有哪些隐患。
  • 打赏
  • 举报
回复
或者你用memcpy也行。
  • 打赏
  • 举报
回复
不行你就用<<移位将数据累加吧,不要用*,速度慢。 我估计你就是对齐问题。 wince里面这种用法一般都要注意这个,还有一个大buf在结构体里面都要注意放前面对齐。反正我自己都是这样用,现在已经多年没遇到这种问题了。
mynews237 2016-12-27
  • 打赏
  • 举报
回复
引用 5 楼 accessysq 的回复:
[quote=引用 4 楼 hailee1985 的回复:] [quote=引用 2 楼 accessysq 的回复:] 不知道是不是跟地址对齐有关系。p的地址不是4的倍数,不过我遇到的好像是写才会出现,读好像可以通过,太久了。
LZ没有提到说是值不对,是说不能执行,这个不是很奇怪吗?跟对齐应该也没关系啊,不对齐,编译器只是会多给几条汇编指令来合并结果而已,但不会出现不能执行。 这个现象确实奇怪。[/quote] 会跑飞,不是值不对,[/quote] 首先,谢谢大家的关注。 我是想在buf[1]之后的连续4个字节,取出一个unsigned long型的数据。这个数应该是a = 0x04030201这个数。 我又做了实验,将其改为 p = (unsigned long *)(buf+0); a = *p; 这样的话取值是没有问题的,a = 0x03020100,但是我是想在有偏移1个字节的地址取数据。 其实我也可以写成a = buf[4]*255*255*255+buf[3]*255*255+buf[2]*255+buf[1]; 但是我不明白, p = (unsigned long *)(buf+1); a = *p; 这样写为什么不对,这在PC机的编译环境下是没有问题的,是WINCE有什么特殊限制吗?我也是刚接触WINCE,不太了解这方面的东东。 现在的现象就是执行到 p = (unsigned long *)(buf+1); a = *p; 的时候,程序就不执行了,就是说不能执行AfxMessageBox(s),打不出s这个东西来; 但是将p = (unsigned long *)(buf+0);就没有任何问题,可以正常打印。 而且我还看了汇编,其实两种情况就差了add r3, #1,这一条汇编指令,其他汇编指令都差不多,就是ldr r3, [r3]就过不去了。但是p = (unsigned long *)(buf+0);也是ldr r3, [r3],就能过去。
  • 打赏
  • 举报
回复
引用 4 楼 hailee1985 的回复:
[quote=引用 2 楼 accessysq 的回复:] 不知道是不是跟地址对齐有关系。p的地址不是4的倍数,不过我遇到的好像是写才会出现,读好像可以通过,太久了。
LZ没有提到说是值不对,是说不能执行,这个不是很奇怪吗?跟对齐应该也没关系啊,不对齐,编译器只是会多给几条汇编指令来合并结果而已,但不会出现不能执行。 这个现象确实奇怪。[/quote] 会跑飞,不是值不对,
hailee1985 2016-12-27
  • 打赏
  • 举报
回复
引用 2 楼 accessysq 的回复:
不知道是不是跟地址对齐有关系。p的地址不是4的倍数,不过我遇到的好像是写才会出现,读好像可以通过,太久了。
LZ没有提到说是值不对,是说不能执行,这个不是很奇怪吗?跟对齐应该也没关系啊,不对齐,编译器只是会多给几条汇编指令来合并结果而已,但不会出现不能执行。 这个现象确实奇怪。
hailee1985 2016-12-27
  • 打赏
  • 举报
回复
LZ具体什么问题?感觉代码没问题啊
  • 打赏
  • 举报
回复
不知道是不是跟地址对齐有关系。p的地址不是4的倍数,不过我遇到的好像是写才会出现,读好像可以通过,太久了。
91program 2016-12-27
  • 打赏
  • 举报
回复
你试试如下看行不行:

unsigned char *p = (unsigned char *)(buf+1);
unsigned char a = *p; 
指针的位置是相同的,只是偶的代码取一个字节,而 LZ 你的是取 4 个字节。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧