数据类型强制转换 long data=*(long*)pointer;

Coolearth 发布于 2012/07/05 10:07
阅读 1K+
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

如标题所示,pointer指针指向一块存放数据的内存, long data1=*(long*)pointer+offset; offset+=sizeof(long); long data2=*(long*)pointer; ...... 问题是PC上程序运行正常,可这段程序移植到移动设备就出问题了,比如死机,调试跟踪发现,前几次调用可以正常转换数据,可是突然某一次就崩溃了; 请教的问题是这里的强制转换有什么隐含的隐患么?还是说移动设备的强制类型转换和PC上不一致?
加载中
0
RYAN_____
RYAN_____
移动设备的内存有限 你看看是不是内存太小了 看看你那个系统的最大堆栈能分配多少
0
中山野鬼
中山野鬼
哈哈。你查一下移动设备 long的位宽。然后查一下 32位对齐,64位对齐等问题。强制转换,不是这么玩的。
中山野鬼
中山野鬼
回复 @凉水 : 正确的做法,其实看你的DATA BUS的位宽。只要不大于位宽,芯片商对应的编译器,基本不会出错,你也不需要考虑首地址对齐问题,如果没对齐,CPU会自动传两次合并进来。并不需要你一个byte一个byte的自己复合。
Coolearth
Coolearth
当然,正确的方法是依次取单个字节做位移再相加,得到4字节的数值大小,这样是可以的,只是不太明白这样写法出错的原因。。。
0
周翼翼
周翼翼
long data1=*(long*)pointer+offset;确定这是你真正的意思? 实在不知道你这个offset是做什么.
Coolearth
Coolearth
漏括号了。。。
0
中山野鬼
中山野鬼

引用来自“周翼翼”的答案

long data1=*(long*)pointer+offset;确定这是你真正的意思? 实在不知道你这个offset是做什么.
他想把 pointer 作为基地址, offset每次累加作为偏移量。实际上 ((long*)p)[n],一样可以。。。
0
johnzhang68
johnzhang68
没有必要这么用。该用指针的地方就直接用指针就好。这样用即使用对了也还是容易误导自己和别人。
0
周翼翼
周翼翼

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

long data1=*(long*)pointer+offset;确定这是你真正的意思? 实在不知道你这个offset是做什么.
他想把 pointer 作为基地址, offset每次累加作为偏移量。实际上 ((long*)p)[n],一样可以。。。

那应该是*((long*)(pointer+offset))才对吧.

所以说要用括号....

0
中山野鬼
中山野鬼

引用来自“周翼翼”的答案

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

long data1=*(long*)pointer+offset;确定这是你真正的意思? 实在不知道你这个offset是做什么.
他想把 pointer 作为基地址, offset每次累加作为偏移量。实际上 ((long*)p)[n],一样可以。。。

那应该是*((long*)(pointer+offset))才对吧.

所以说要用括号....

这是肯定。不过这不是两边跑不一致的根本原因,不管PC上跑的是对是错。。。
0
周翼翼
周翼翼

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

long data1=*(long*)pointer+offset;确定这是你真正的意思? 实在不知道你这个offset是做什么.
他想把 pointer 作为基地址, offset每次累加作为偏移量。实际上 ((long*)p)[n],一样可以。。。

那应该是*((long*)(pointer+offset))才对吧.

所以说要用括号....

这是肯定。不过这不是两边跑不一致的根本原因,不管PC上跑的是对是错。。。
那你说什么是根本原因~~
0
中山野鬼
中山野鬼

引用来自“周翼翼”的答案

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

long data1=*(long*)pointer+offset;确定这是你真正的意思? 实在不知道你这个offset是做什么.
他想把 pointer 作为基地址, offset每次累加作为偏移量。实际上 ((long*)p)[n],一样可以。。。

那应该是*((long*)(pointer+offset))才对吧.

所以说要用括号....

这是肯定。不过这不是两边跑不一致的根本原因,不管PC上跑的是对是错。。。
那你说什么是根本原因~~
不知道。哈。。。。。要做测试。不是调戏你。
0
Lunar_Lin
Lunar_Lin

      移动设备的编译器, 交叉编译环境都不一样. 编译器不会生成相同的代码. 你期待它们一致本身就很幻想. 做代码实验应该在设备上做.除了平台无关的逻辑, PC上运行没意义.
     话说你发帖子 注意代码正确性, 确定没有()  ??
     个人觉得:
     offset的大小问题.在移动设备上它可能很小, 很快就溢出了.

Lunar_Lin
Lunar_Lin
回复 @凉水 : 几乎所有设备的CPU都支持在线调试的, 你确定你的CPU没JTAG管脚?不支持调试? log调试方式也不算差. 写好print, 把每步的值都从串口or其它IO 输出, 也还算直观. 你贴的代码太少看不出问题. 看看一些细节点吧, 比如未初始化的数据, 数据类型溢出, 字面量超过范围. 加油.
Coolearth
Coolearth
自我批评下,括号是写错了,移动设备上做试验,目前只能通过打印log查看数值,非常有限。。。
中山野鬼
中山野鬼
回复 @Lunar_Lin : offset对指针没有影响,但是long的位宽,可承受的数值累加的次数,会有影响。加啊加啊。。。可能就小了。哈。
Lunar_Lin
Lunar_Lin
或者问题原因压根不在这里!!
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部