【问题标题】:Size of type and memory allocation [duplicate]类型和内存分配的大小[重复]
【发布时间】:2013-05-18 07:30:50
【问题描述】:

我遇到了动态内存分配问题。 不知何故,我的结构的实际大小(所有部分的总和)小于类型本身的大小。这是代码:

#include <stdio.h>
#include <malloc.h>

struct Lol {
    int a;
    char b;

    char s[20];
};

void main() {

    Lol* lol = (Lol*)malloc(sizeof(Lol));

    printf("Type size: %d bytes\n", sizeof(Lol));
    printf("Actual struct size: %d bytes\n", sizeof(lol -> a) + sizeof(lol -> b) + sizeof(lol -> s));

 }

在这种情况下,结构大小应为 25 个字节(4 个字节用于 int,1 个字节用于 char,20 个字节用于 char 数组),但 sizeof(Lol) 出于某种原因显示为 28,因为 char 类型将被视为 int类型。这一切是怎么回事?这是否意味着我什么都没有丢失 3 个字节?

【问题讨论】:

    标签: c memory malloc memory-leaks sizeof


    【解决方案1】:

    我的结构的实际大小(所有部分的总和)小于类型本身的大小"

    由于许多计算机操作在它们处理的值在某些内存边界对齐时会更快,因此 C 语言标准允许实现进行这种对齐。在大多数系统上,int 将在 4 或 8 字节边界上对齐,具体取决于 int 的大小。结构的大小必须对齐,以便数组中下一个结构的地址正确对齐,因此以 int 开头的结构必须与 4 字节边界对齐,其大小必须是 4 的倍数。

    这是否意味着我什么都没有丢失 3 个字节?

    是的。 (嗯,这并不是什么都没有......你的程序通常会因此而更快。)现代机器支持高达 2 TB 的 RAM,这比以前更不用担心了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 2018-09-27
      • 2021-01-26
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      相关资源
      最近更新 更多