强制填充C结构内部

时间:2015-04-24 09:56:39

标签: c struct padding

我想知道是否有办法强制填充C结构的字段。 我将尝试用一个例子更好地解释它: 如果我有以下结构:

struct foo{
    int32 a,
    int16 b,
    int8 c,
    int32 d,
    int32 e
};

我想以下列方式映射它(将0x00视为起始地址:

&foo.a = 0x00
&foo.b = 0x08
&foo.c = 0x0A
&foo.d = 0x10
&foo.e = 0x18

这样字段每8个字节打包4个字节。

我显然知道我可以插入“填充字段”,但这是唯一的解决方案吗?

2 个答案:

答案 0 :(得分:0)

这个结构定义:

\p{foo}

按以下方式填充:

String sentence = "In (the) preceding examples, classes derived from...";
Pattern p = Pattern.compile("[.]{3}|\\p{Punct}|[\\S&&\\P{Punct}]+");
Matcher m = p.matcher(sentence);
while(m.find()){
    System.out.println(m.group());
}

答案 1 :(得分:0)

C11具有_Alignas说明符。这个声明:

#include <stdio.h>
#include <stdint.h>

struct foo {
    _Alignas(8) int32_t a;
    _Alignas(4) int16_t b;
    _Alignas(4) int8_t c;
    _Alignas(8) int32_t d;
    _Alignas(8) int32_t e;
};

#define OFF(s, f)   ((uintptr_t)(&(s).f) - (uintptr_t)(&(s)))

int main() {
    char x;
    struct foo foo;

    printf("%p %x %x %x %x %x\n", (uintptr_t)(&foo), OFF(foo, a), OFF(foo, b), 
                                OFF(foo, c), OFF(foo, d), OFF(foo, e));
}

提供您要求的准确对齐方式:

0x7fff6cbf2780 0 4 8 10 18

使用gcc 4.8.3在x86_64上编译-std=gnu11