[英]Pointer Dereferencing = Program Crash
unsigned int *pMessageLength, MessageLength;
char *pszParsePos;
...
//DATA into pszParsePos
...
printf("\nMessage Length\nb1: %d\nb2: %d\nb3: %d\nb4: %d\n",
pszParsePos[1],pszParsePos[2],pszParsePos[3],pszParsePos[4]);
pMessageLength= (unsigned int *)&pszParsePos[1];
MessageLength = *((unsigned int *)&pszParsePos[1]);
//Program Dies
输出:
Message Length b1: 0 b2: 0 b3: 0 b4: 1
我不明白为什么这会让我的程序崩溃。 有人可以解释一下,或者至少建议一种不会崩溃的替代方法吗?
谢谢你的时间!
总线错误意味着您尝试访问错误对齐的数据。 具体来说,似乎处理器要求int
比任何地方更严格地对齐,如果你的*pszParsePos
是对齐的,比如在int
边界上(这取决于你如何初始化它,但是会发生,例如,如果你使用malloc
),肯定&pszParsePos[1]
不是。
解决这个问题的一种方法是明确地构造MessageLength
,即类似的东西
MessageLength = (pszParsePos[1] << 24) | (pszParsePos[2] << 16) | (pszParsePos[3] << 8) | pszParsePos[4]
(或者相反,如果它应该是小端)。 如果你真的想要输入双关语,请确保你正在访问的指针正确对齐。
这是我认为出错的地方:
您在评论中添加了您在Blackfin处理器上运行的内容。 我在一些网站上看了这个,他们声称Blackfin需要所谓的对齐访问。 也就是说,如果要向存储器读取或从存储器写入32位值,则物理地址必须是4字节的偶数倍。
C中的数组以[0]开头索引,而不是[1]。 一个4字节的char数组以元素[3]结束。
在您的代码中,您有一个4字节的char数组,其中:
我怀疑你的4-char数组是否与4字节边界对齐,但是当你开始在+1字节位置进行内存访问时,你会得到数据总线错误的错位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.