首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构的大小怎么可能是4的非倍数?

结构的大小怎么可能是4的非倍数?
EN

Stack Overflow用户
提问于 2019-04-09 22:01:13
回答 3查看 615关注 0票数 1

我刚接触结构,正在学习如何找到结构的大小。我知道填充是如何发挥作用的,以便正确地对齐内存。

代码语言:javascript
复制
struct books{
  short int number;
  char name[3];
}book;
printf("%lu",sizeof(book));

最初,我认为短的int会占用2个字节,然后是从第三个内存位置开始的字符数组。然后,字符数组需要3个字节的填充,大小为8。类似这样,其中每个单词表示内存中的一个字节。

短短的字符

字符填充

然而,在运行时,它的大小是6,这让我感到困惑。

如有任何帮助,将不胜感激,谢谢!

EN

Stack Overflow用户

发布于 2019-04-09 22:16:34

代码语言:javascript
复制
#include <stdalign.h>
#include <assert.h>

结构的大小总是可以被成员的最大对齐整除(必须是2的幂)。如果你有一个带有charshort的结构,对齐是2,因为short的对齐是2,如果你有一个结构,只有在char中它的对齐是1。

有多种方法可以操作对齐方式:

代码语言:javascript
复制
alignas(4) char[4]; // this can hold 32-bit ints

这是非标准的,但在大多数编译器(GCC,Clang,...)中都可用:

代码语言:javascript
复制
struct A {
    char a;
    short b;
};

struct __attribute__((packed)) B {
    char a;
    short b;
};

static_assert(sizeof(struct A) == 4);
static_assert(alignof(struct A) == 2);

static_assert(sizeof(struct B) == 3);
static_assert(alignof(struct B) == 1);
票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55594696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档