繁体   English   中英

指针解除引用=程序崩溃

[英]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数组,其中:

  • 你把它看作是从索引1开始的。
  • 您通过32位内存提取将指针强制转换为DWORD。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM