变量char的大小到一个结构(C ANSI)

时间:2014-10-24 14:25:00

标签: c char structure

我有以下代码

#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)还是有另一种方式?

亚历

1 个答案:

答案 0 :(得分:2)

空字符需要第五个字节。否则,将在下一个字段开始的相同偏移处写入空字符,并将字符串复制到下一个字段有效地覆盖最后一个空字符。打印字符串只需循环遍历每个字符,直到找到\0

char类型具有最不严格的对齐要求,也就是说,它可以位于任何地址,因此编译器不会插入任何填充。