我将通过以下链接了解内存对齐:https://www.ibm.com/developerworks/library/pa-dalign/#N10159。但是我无法理解下面给出的代码片段。

void Munge8( void *data, uint32_t size ) {
    uint8_t *data8 = (uint8_t*) data;
    uint8_t *data8End = data8 + size;

    while( data8 != data8End ) {
        *data8++ = -*data8;
    }
}

这里的目的是增加指针,这可以通过“data8=data8+1”来完成,但是所讨论的代码使用“*data8++=-*data8”。它们都工作得很好,即增加指针,但我无法理解后面的逻辑。比“data8=data8+1”好吗?
在编译期间,我得到一个错误“alignment_test1.c:44:warning:operation on'data8'may be undefined”。
问题的第二部分是关于下面的代码片段(来自前面提到的同一个链接)。
清单2。一次咀嚼两个字节的数据
void Munge16( void *data, uint32_t size ) {
    uint16_t *data16 = (uint16_t*) data;
    uint16_t *data16End = data16 + (size >> 1); /* Divide size by 2. */
    uint8_t *data8 = (uint8_t*) data16End;
    uint8_t *data8End = data8 + (size & 0x00000001); /* Strip upper 31 bits. */

    while( data16 != data16End ) {
        *data16++ = -*data16;
    }
    while( data8 != data8End ) {
        *data8++ = -*data8;
    }
}

第二个“while”循环背后的原因是什么?因为在这种情况下,data8和data8End总是一样的。

最佳答案

那篇文章的代码一团糟。不要阅读或研究它。立即停止阅读这篇文章。
*data8++ = -*data8;调用未定义的行为,因为它包含对data8的未排序访问。查看最常见的C常见问题解答:Why are these constructs (using ++) undefined behavior?
根据数据的原始类型,第二部分很可能包含各种形式的严格别名行为,另一种形式的未定义行为。不能将指向某个对象的指针转换为指向uint16的指针,然后像访问uint16_t一样访问内容,除非这是对象的原始类型(有效类型)。这就引出了另一个常见的C FAQ,What is the strict aliasing rule?
您可以将文章的作者引向这些链接,并告诉他们在尝试在internet上发布技术文章之前,先学习基本的C编程。

10-08 03:54