C 结构中定义的字符需要多少字节?

C 结构中定义的字符需要多少字节?,c,data-structures,C,Data Structures,当我在一个结构中定义一个字符类型时,它似乎需要超过1个字节;事实上,它似乎需要4个字节 以下是我的节目: #include <stdio.h> int main(void) { struct book{ char name; float price; int pages; }; struct book b1={'B',130.00,550}; printf("\nAddress of structure

当我在一个结构中定义一个字符类型时,它似乎需要超过1个字节;事实上,它似乎需要4个字节

以下是我的节目:

#include <stdio.h>

int main(void)
{
    struct book{
        char name;
        float price;
        int pages;
    };
    struct book b1={'B',130.00,550};
    printf("\nAddress of structure:%u",&b1);
    printf("\nAddress of character name:%u",&b1.name);
    printf("\nAddress of float price:%u",&b1.price);
    printf("\nAddress of integer pages:%u",&b1.pages);
    printf("\n\n");
    return 0;
}
为什么我看到变量“name”和变量“price”的地址之间有4个字节的差异


运行此程序的系统是运行Fedora-14的x86_64位arch。

C标准允许实现向结构添加额外的填充位,以便通过使结构与实现所需的字节边界对齐来更快地访问结构

这被称为

鉴于上述情况,结构的尺寸可能与单个构件的尺寸总和不同。您应该始终使用
sizeof
来确定结构的大小


此外,上面提到的原因是,您没有看到放置在预期内存地址的结构成员。

您遇到了对齐规则。这是一个非常特定于编译器和系统的东西,但在默认情况下(即,除非您在代码中使用编译器标志或特殊对齐请求指定其他内容),x64 Linux上的GCC会将结构的每个字段按其大小的倍数对齐。因此,一个单字符字节没有什么特别需要担心的对齐问题。但是,int或float总是放在4字节边界上,double总是放在8字节边界上。这就是你在这里看到的


正如Ethan在上面的评论中所指出的,一些处理器甚至不会访问未按某种方式对齐的内存对象,如果内存未对齐,英特尔处理器访问内存的速度会慢得多。

严格来说,
字符始终占用一个字节,但后面可能会有0个或更多字节的填充。填充量取决于编译器、CPU、结构中
char
后面类型的对齐方式以及任何有效的打包杂注。如果N字节类型必须是N字节对齐的,例如在SPARC上,则:

struct s16 { char c; double d; };
struct s8  { char c; long l;   };
struct s4  { char c; short s;  };
struct s2  { char c; char b;   };
在SPARC机器上,以及在x86_64机器上,上述结构中单独的
char
后跟7、3、1和0字节。

C中的“char”通常正好需要8位(一个字节)

但是,结构中的字符在字、双字甚至四字边界上“对齐”:

有编译器指令可以强制对齐到4、2或1字节(这可以避免这种行为)


例如,在VisualC++中,你可以说“γ-PrimaPACK(1)”。< /P>编译器正在打包结构,以便数据成员正确对齐,程序可以快速运行。由于对齐不良,一些芯片(ARM)在您身上出现故障,其他芯片(x86)运行较慢。在64位机器中,64位的内存字是由32位的32位地址x86创建的_64@RashmiKantShrivastwa感谢您的回复,我们将阅读更多关于填充的信息。对于您的回复,现在我明白了为什么我会看到这种行为。谢谢lot@user1150645:不,问题:)做你认为最好的答案。
struct s16 { char c; double d; };
struct s8  { char c; long l;   };
struct s4  { char c; short s;  };
struct s2  { char c; char b;   };