一个指针转换问题

zhangchaoyszq 2009-06-09 05:24:03

大家比较一下这段程序在win32平台与mobile 5.0平台下的结果:
我测试结果是Win32平台,都没有问题。可以正常运行
但是在mobile5.0平台下。问题来啦:

运行到13行,没有问题。可是我通过一个test(unsigned char *buf)传进去的时候,
运行到第3行就出错 啦。这是为什么呢?第3行与第13行代码一样的。难道传进去的参数内存溢出。怎么解决呢?

1行 void test(unsigned char*buf)
2行{
3行 *(unsigned short*)&buf[0] = *(unsigned short*)&buf[1];
4行}
5行main()
6行{
7行 //测试类型转换
8行 unsigned char tempbuffer[1024]={0};
9行
10行 unsigned short tempshort=0;
11行 tempshort = *(unsigned short*)&tempbuffer[1];
12行
13行 *(unsigned short*)&tempbuffer[0] = *(unsigned short*)&tempbuffer[1];
14行 test(tempbuffer);
15行
16行}
...全文
39 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangchaoyszq 2009-06-09
  • 打赏
  • 举报
回复
ies_sweet 你分析我很有道理。在网上也有找到一些这方面的说法。我再看看吧。解决后给分你们。
ies_sweet 2009-06-09
  • 打赏
  • 举报
回复
问题是这样的,简单来说,还是内存对齐问题。

一般来说,某种类型在内存中的位置,必须圆整在自身长度的地址上

比如short,在某平台下占2字节,那么如果在内存地址为奇数的位置访问
将会引起总线错误

根据楼主描述
char 在win32下应该是占4个字节,而short也是4个字节,这没有问题。

但是在另外一个平台下,mobile5.0也许就是另外一个情况了
char可能只占1个字节,那么tempbuffer地址应该从偶数开始(编译器总会这样做)
所以说,当进入test()函数后,访问buf[1]的地址时,这是个奇数地址
但是short是2字节长度的,所以在这个地址将引起总线错误

总体来说,这是两个平台对不同数据类型的长度定义不同引起的现象差异
根本上,还是内存对齐问题。
关于内存对齐,楼主可以在网上搜索以下,资料一大堆的。
风老二 2009-06-09
  • 打赏
  • 举报
回复
去掉short修饰试试
test[uchar s1,uchar s2]
test(tmpbuf[0],tmpbuf[1])
这样试试
ies_sweet 2009-06-09
  • 打赏
  • 举报
回复

void test(unsigned char*buf)
{
*(unsigned short*)&buf[0] = *(unsigned short*)&buf[1];
}
main()
{
//测试类型转换
unsigned char tempbuffer[1024]={0};

unsigned short tempshort=0;
tempshort = *(unsigned short*)&tempbuffer[1];

*(unsigned short*)&tempbuffer[0] = *(unsigned short*)&tempbuffer[1];
test(tempbuffer);
}

先重新贴一下代码
zhangchaoyszq 2009-06-09
  • 打赏
  • 举报
回复
hotlogo :你的方法也试啦。还是不行哦。我怀疑是与平台有关的。真郁闷。
jianzhibeihang 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mengde007 的回复:]
mobile5.0没用过;
[/Quote]
re
hotlogo 2009-06-09
  • 打赏
  • 举报
回复
13行的是数组,这样赋值没问题
第3行传的参数是指针
可以改成这样试试


1行 void test(unsigned char*buf)
2行{
3行 *(unsigned short*)buf = *(unsigned short*)(buf+1);
4行}
5行main()
6行{
7行 //测试类型转换
8行 unsigned char tempbuffer[1024]={0};
9行
10行 unsigned short tempshort=0;
11行 tempshort = *(unsigned short*)&tempbuffer[1];
12行
13行 *(unsigned short*)&tempbuffer[0] = *(unsigned short*)&tempbuffer[1];
14行 test(tempbuffer);
15行
16行}
mengde007 2009-06-09
  • 打赏
  • 举报
回复
mobile5.0没用过;
lylm 2009-06-09
  • 打赏
  • 举报
回复
debug吧

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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