类型和内存分配的大小

时间:2013-05-18 07:30:50

标签: c memory malloc memory-leaks sizeof

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

#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));

 }

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

1 个答案:

答案 0 :(得分:1)

  

我的struct的实际大小(所有部分的总和)小于类型本身的大小“

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

  

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

是。 (嗯,它并不是什么都没有......因为它,你的程序通常会更快。)现代机器支持高达2TB的RAM,这不像以前那么令人担忧。