永发信息网

把字节型指针转换成整型指针时,如何保证4字节对齐?

答案:2  悬赏:80  手机版
解决时间 2021-04-04 21:46
  • 提问者网友:浩歌待明月
  • 2021-04-04 06:55
把字节型指针转换成整型指针时,如何保证4字节对齐?
最佳答案
  • 五星知识达人网友:平生事
  • 2021-04-04 07:33
字节型指针指向多少就是多少,没办法对齐的啊
比如这样一块内存:
0x12340000 41 42 43 44 45 46 47 48
0x12340008 49 4a 4b 4c 4d 4e 4f 00
若char* p = (char*) 0x12340000; 即p代表"ABCDEFGHIJKLMNO"
现在令 char* p2 = p1 + 7; 即 0x12340007
那么 int* p3 = (int*) p2; 的话,则使用 *p3 访问内存会造成效率低下或者出错(如果操作系统事先没有设置让它自动多次读取以获取非对齐数据的话,甚至会直接出错)
那么你要做的事情是什么?要让p3的值是 0x12340004吗?

int* p3 = (int*) ((unsigned int)p2 & ~3); //最后两位中所有的1都抹掉
这样p3就是0x12340004了追答
追问:非常感谢您的回答!
这正是我想做的事! 但是我的编译环境比较特殊,不支持指针转换成整型,有什么方法可以绕过这一步呢?
追答:那就指针转指针吧。
char* p2 = ...(一个非对齐的指针)
int* p3 = (int*) p2;
int* p4 = (int*)&p3;
*p4 &= ~3;
然后p3就对齐了
追问:为什么不直接 p3 &= ~3 呢?
追答:我记得指针类型不让你用~运算的吧?
追问:int* p4 = (int*)&p3; 这一步就相当于做了一个强制转换吧?指针转指针。我去试试,谢谢高人指点!
追答:因为&p3类型是int**,二级指针。要把里面的内容当作int操作就必须要先转一级指针
全部回答
  • 1楼网友:时间的尘埃
  • 2021-04-04 08:13
如果你只是想把字节型指针指向的地址取4个字节出来当整型用,那就不用4字节对齐,直接强制类型转换就可以了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯