我有以下代码
#include <stdio.h>
#include <string.h>
struct Wdd
{
char protocolId[4];
char messageId[4];
char sizeBody[4];
};
main()
{
struct Wdd msgWdd;
strcpy(msgWdd.protocolId, "GABC");
strcpy(msgWdd.messageId, "WDSS");
strcpy(msgWdd.sizeBody, "0020");
printf("protocolId: %s\n", msgWdd.protocolId);
printf("messageId: %s\n", msgWdd.messageId);
printf("sizeBody: %s\n", msgWdd.sizeBody);
printf("sizeStructure: %d\n", sizeof(msgWdd));
}
打印结果是
protocolId: GABCWDSS0020
messageId: WDSS0020
sizeBody: 0020
sizeStructure: 12
为什么?如果我将字段的大小更改为“5”,则打印(正确,就像我预期的那样)
protocolId: GABC
messageId: WDSS
sizeBody: 0020
sizeStructure: 15
为什么?
我已经阅读了编译器填充一些字节到对齐要求,但我无法理解它。要解决这个问题,我应该增加字段的大小(到5)还是有另一种方式?
亚历
答案 0 :(得分:2)
空字符需要第五个字节。否则,将在下一个字段开始的相同偏移处写入空字符,并将字符串复制到下一个字段有效地覆盖最后一个空字符。打印字符串只需循环遍历每个字符,直到找到\0
。
char
类型具有最不严格的对齐要求,也就是说,它可以位于任何地址,因此编译器不会插入任何填充。