c-比较if语句中的指针值



4为什么这个块抛出内存错误:

uint8_t buffer[ 8 ] = { 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 };
if ( *((uint32_t *)(&buffer[ 0 ])) == *((uint32_t *)(&buffer[ 4 ])) + 1 )
    return TRUE;

当这个块工作时:

uint8_t buffer[ 8 ] = { 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 };
uint32_t comp1 = *((uint32_t *)(&buffer[ 0 ]));
uint32_t comp2 = *((uint32_t *)(&buffer[ 4 ]));
if ( comp1 == comp2  + 1 )
    return TRUE;

问题可能来自缓冲区的对齐。由于您的缓冲区被声明为uint8_t[],编译器不必对其进行对齐

这通常不是问题(但通常会导致较小的性能损失),但有些体系结构拒绝访问未对齐的指针。在这些体系结构上,非对齐访问必须在软件中完成。

在这里,我假设您的HardFaultException来自ARM,并且此链接建议使用__packed属性让编译器知道指针可能未对齐。然后编译器将使用软件未对齐的访问。

需要注意的是,现代ARM不再存在这个问题。链接谈到"旧的ARM处理器",我没有注意到现代ARM上的这个问题。

相关内容

  • 没有找到相关文章

最新更新