指针解除引用=程序崩溃

时间:2009-10-16 18:30:05

标签: c pointers

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

我不明白为什么这会导致程序崩溃。有人可以解释一下,或者至少建议一种不会崩溃的替代方法吗?

谢谢你的时间!

2 个答案:

答案 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数组:

  • 您将其视为从索引1开始。
  • 通过32位内存提取将指针强制转换为DWORD。

我怀疑你的4-char数组与4字节边界对齐,但是当你在+1字节位置开始你的内存访问时,你会得到数据总线错误的错位。