c - 是否有一种 "nice"方法可以将指向结构的指针前进一个字节?

标签 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);
}

编译器在“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);
     ^

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

有没有办法让它变得更好?

最佳答案

这没有多大意义。如果您将结构指针增加 1 个字节,您最终会得到一个未对齐的地址,这在大多数系统上都是有问题的。我必须假设您的系统不是任何主流 32/64 位 CPU(不是 x86、ARM、PowerPC 等),否则您的问题毫无意义。

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

ps = (s_t*) ((uintptr_t)ps + 1);

关于c - 是否有一种 "nice"方法可以将指向结构的指针前进一个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44919956/

相关文章:

c++ - 为什么 --list.end() 编译?

c - 如何在成对结构中可移植地保存两个内存字?

c++ - 向大数组减去或添加常量

c - 双向链表释放内存 valgrind 错误

c - gettimeofday 可能无法在 C 中获得正确的时间

c - 快速排序代码不适用于排序数组

c - 如何在特定字符串后打印值

c++ - 有什么方法可以将右值/临时对象传递给需要非成本引用的函数?

c++ - 将左值传递给右值

c++ - 指针算术递增后缀/前缀