PIC32解除引用指针可能的编译器错误

S E*_*S E 2 c compiler-construction pointers pic pic32

我正在使用XC32编译器为PIC32MX795F512L编写一些代码.我需要从作为void*传递给函数的缓冲区中读取数据.我需要将数据作为无符号32位整数数组读取.问题是当我将void*转换为uint32*并尝试读取该数组的索引0处的值时,处理器会调用一般错误处理程序,而如果我将void*转换为uint8*并执行某些操作位操作得到相同的数据,它工作正常.

代码如下所示:

void foo(void* data, uint32 length)
{
    uint32 i,j;
    uint32 block;
    for(i = 0, j = 0; i < length; i+= sizeof(uint32),j++)
    {
        printfUART(DEBUG_UART,"Debug 0\r\n");
#if 0//working code
        block = ((uint8*)data)[i + 3];
        block <<= 8;
        block |= ((uint8*)data)[i + 2];
        block <<= 8;
        block |= ((uint8*)data)[i + 1];
        block <<= 8;
        block |= ((uint8*)data)[i + 0];
#else//not working code
        block = ((uint32*)data)[j];
#endif
        printfUART(DEBUG_UART,"Debug 1\r\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您更改#if 0#if 1的代码按预期工作,我看到"Debug 0""Debug 1"在循环印刷多次.

但如果按原样保留,"Debug 0"只打印一次,然后代码跳出循环进入编译器设置的cpu通用错误处理程序.这是XC32 ompiler中的一个错误,还是有什么遗漏?

und*_*gor 5

我认为这是一个对齐问题.

如果data不在偶数地址(例如,因为它实际上是一个字节数组),那么在您的平台上无法以32位方式访问它.

C标准(ISO/IEC 9899:1999,6.3.2.3)说:

指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针.如果生成的指针未针对指向类型正确对齐,则行为未定义.