struct something {
uint32_t a;
uint8_t b;
uint16_t c;
uint32_t x;
uint16_t y;
uint8_t z;
};
uint8_t *data = malloc(14);
struct something *s = (struct something *)data;
s->a = 1;
s->b = 2;
s->c = 3;
s->x = 4;
s->y = 5;
s->z = 6;
Run Code Online (Sandbox Code Playgroud)
在C中执行此操作是否总是安全的,或者结构填充可能会导致问题?
编辑1(说清楚):是否保证数据[0] ..数据[3] == 1,数据[4] == 2,数据[5] ..数据[6] == 3,数据[ 7] ..数据[10] == 4,数据[11] ..数据[12] == 5和数据[13] == 6?
编辑2:编辑1时出现小错误
dbu*_*ush 10
这不是一个安全的操作.编译器将以实现定义的方式添加填充.
一般而言,给定大小的成员将在偏移上对齐,该偏移是该大小的倍数.
给定填充的典型方式,这struct很可能是16字节大小.物理布局很可能(但不一定)看起来像这样:
struct something {
uint32_t a; // offset 0
uint8_t b; // offset 4
// 1 byte padding
uint16_t c; // offset 6
uint32_t x; // offset 8
uint16_t y; // offset 12
uint8_t z; // offset 14
// 1 byte padding
};
Run Code Online (Sandbox Code Playgroud)
不要使用魔术数字.Intead,使用sizeof运算符.
struct something *s = malloc(sizeof(struct something));
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您想增加struct以特定方式布置的机会,请参阅本指南以了解结构包装.如果你遵循这里的做法,你很有可能(但不是100%)将你的struct意志按照你期望的方式安排在记忆中.
对于gcc,您可以使用__attribute__((packed))a struct来删除a 中的填充struct.但是,这样做可能会导致性能下降或导致页面错误.该-Wpadded和-Wpacked选项还可以告诉你更多关于填充.
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |