- 论坛徽章:
- 0
|
原帖由 yhb04 于 2009-5-17 19:11 发表
typedef struct {
int head;
int size; //指明整个包的长度
char reply;
char data[1];
} packet;
packet* cmd = malloc (sizeof(packet) + 20); //多空几个字节无所谓
...
呵呵,小伙子水平不高口气不小。
首先char data[1]解决不了问题,char data[0]不是C标准,前者是C标准而已。
其次,gcc手册没有对零长数组有太多解释,这本来就是个简单的东西。其次这里的内存布局和是不是零长数组没有关系,把char data[0]换成char data是一样。不过你还是说对了,这是内存布局的问题引起的,具体的说着取决于padding的位置。我怀疑你是猜的,因为编译手册是不会讲这个内存布局的,不同的架构对padding有不同的规定。这个是架构的ABI或software conventions规定的。例如
- struct example {
- int a;
- int b;
- char c;
- char d;
- };
- sizeof (struct example) == 12;
- offsetof (struct example, d) == 9;
复制代码
恍然一看似乎offsetof在计算偏移的时候没有算padding,实际不然,padding在最后两个字节,所以上面例子的内存布局是:
a(4 bytes) b(4 bytes) c(1 byte) d(1 byte) padding (2 bytes)
对于我用的 x86平台,这个其在ABI手册有规定:
Each member is assigned to the lowest available offset with the appropriate
alignment. This may require internal padding, depending on the previous
member.
这里d前面的c同样是char类型,所以两者之间没有padding,而根据另一条规定:
A structure¡¯s size is increased, if necessary, to make it a multiple of the
alignment. This may require tail padding, depending on the last member.
把padding放在了最后,即tail padding。
如果有一种架构使用不同的padding方式,例如:
a(4 bytes) b(4 bytes) c(1 byte) padding (1 byte) d(1 byte) padding (1 byte)
则offsetof (struct example, d) == 10;
gcc关于零长数组的章节有点长,并且和这里的内容没有什么关系,就不贴了。我估计你也没看过,它的标题是“5.14 Arrays of Length Zero”,不信你可以去看看。
[ 本帖最后由 zx_wing 于 2009-5-17 23:15 编辑 ] |
|