我想知道是否有办法强制填充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个字节。
我显然知道我可以插入“填充字段”,但这是唯一的解决方案吗?
答案 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
。