有没有一种“不错的”方法可以将指向结构的指针前进一个字节?

Mar*_*kus 1 c lvalue pointer-arithmetic

我有一个指向要在一个地址范围内逐字节移动的结构的指针。我有一种可行的方法,但在我看来却很难看。不幸的是,“不错”的方法行不通。这是一个最小的示例:

#include <stdint.h>

typedef struct {
    uint32_t a;
    uint32_t b;
} s_t;

int main( int argc, char** argv )
{
    uint32_t address = 17;
    s_t* ps = (s_t*) address;

    // ugly
    uint8_t* gna = (uint8_t*) ps;
    ++gna;
    ps = (s_t*) gna;

    // nice
    ++((uint8_t*) ps);
}
Run Code Online (Sandbox Code Playgroud)

编译器在“ nice”部分报告错误:

% gcc test.c -o test.bin
test.c: In function 'main':
test.c:17:5: error: lvalue required as increment operand
     ++((uint8_t*) ps);
     ^
Run Code Online (Sandbox Code Playgroud)

我理解该错误,但我认为强制转换为uint8_t *会创建一个左值。显然,我错了。

有没有办法使它更好?

Lun*_*din 5

这没有多大意义。如果将struct指针增加1个字节,则会导致地址未对齐,这在大多数系统上都是有问题的。我必须假设您的系统不是主流的32/64位CPU(不是x86,ARM,PowerPC等),否则您的问题就没有意义了。

要将地址增加一个字节,只需执行以下操作:

ps = (s_t*) ((uintptr_t)ps + 1);
Run Code Online (Sandbox Code Playgroud)