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
我不明白为什么这会导致程序崩溃。有人可以解释一下,或者至少建议一种不会崩溃的替代方法吗?
谢谢你的时间!
答案 0 :(得分:3)
总线错误意味着您尝试访问错误对齐的数据。具体来说,似乎处理器要求int
比任何地方更严格地对齐,如果*pszParsePos
已对齐,请说明int
边界(这取决于您如何初始化它)但是会发生,例如,如果你使用malloc
),肯定&pszParsePos[1]
不是。{/ p>
解决此问题的一种方法是明确构建MessageLength
,即类似
MessageLength = (pszParsePos[1] << 24) | (pszParsePos[2] << 16) | (pszParsePos[3] << 8) | pszParsePos[4]
(或者相反,如果它应该是小端)。如果你真的想要输入双关语,请确保你正在访问的指针正确对齐。
答案 1 :(得分:1)
以下是我认为出错的地方:
您在评论中添加了您在Blackfin处理器上运行的内容。我在一些网站上看了这个,他们声称Blackfin需要所谓的对齐访问。也就是说,如果要从内存中读取或写入32位值,则物理地址必须是4字节的偶数倍。
C中的数组以[0]开头索引,而不是[1]。一个4字节的char数组以元素[3]结尾。
在你的代码中,你有一个4字节的char数组:
我怀疑你的4-char数组与4字节边界对齐,但是当你在+1字节位置开始你的内存访问时,你会得到数据总线错误的错位。