C 指针取消引用=程序崩溃

C 指针取消引用=程序崩溃,c,pointers,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= (uns

输出:

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
消息长度 b1:0 b2:0 b3:0 b4:1 我不明白为什么这会毁了我的程序。有人能解释一下吗,或者至少建议一种不会崩溃的替代方法


谢谢你的时间

总线错误意味着您试图以不正确的对齐方式访问数据。具体来说,处理器似乎要求比任何地方都更严格地对齐
int
,如果您的
*pszParsePos
对齐,比如说在
int
边界上(这取决于您如何初始化它,但会发生,例如,如果您使用
malloc
),则可以肯定
&pszParsePos[1]
不是

解决这个问题的一种方法是显式地构造
MessageLength
,例如

Message Length b1: 0 b2: 0 b3: 0 b4: 1
MessageLength=(pszParsePos[1]以下是我认为的问题:

您在评论中添加了您正在Blackfin处理器上运行的内容。我在一些网站上查找了这一点,他们声称Blackfin需要所谓的对齐访问。也就是说,如果您在内存中读取或写入32位值,那么物理地址必须是4字节的偶数倍

C中的数组是从[0]开始索引的,而不是从[1]。4字节的字符数组以元素[3]结尾

在代码中,您有一个4字节的字符数组,其中:

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

我怀疑您的4字符数组与4字节边界对齐,但当您在+1字节位置开始内存访问时,会出现数据总线错误。

您没有提到:什么操作系统,什么微处理器,当它“死亡”时,您看到了什么错误?它在嵌入式Blackfin处理器上运行uClinux中的ansi C。它是“总线错误”时,它“死亡”,但我认为这与一个Blackfin外围设备没有正确停止有关(但我肯定是错的)。您的系统可能无法访问未对齐的指针。只需在编辑器窗口中高亮显示代码,然后单击看起来像101010的小按钮。是的,我现在已经找到了代码格式。谢谢。不,字符数组比4个字节长得多,我想要的数据位于索引[1]到[4]中.我明白你的意思了,这很有帮助。事情就是这样发生的。谢谢你的帮助!
MessageLength = (pszParsePos[1] << 24) | (pszParsePos[2] << 16) | (pszParsePos[3] << 8) | pszParsePos[4]