`

sizeof结构体分析

 
阅读更多

         最近看书总是遇到定义一个结构体,然后问你sizeof(此结构体)的值是多少?

         本人看了看<<深入理解计算机系统>>一书,由做了些实验。总结一下:

1:

struct Foo{
	int a;
	union U{
		
	}u;
	
};
int main()
{
	printf("%d\n",sizeof(Foo));
	system("pause");
	return 0;
}

 输出:8

因为空的Union占一个字节。默认4字节对齐。

 

2:

#pragma pack(2)
struct Foo{
	int a;
	union U{
		
	}u;
	
};
int main()
{
	printf("%d\n",sizeof(Foo));
	system("pause");
	return 0;
}

 这样要是指定是2字节对齐,那么输出结果就是2了。

 

3:

#pragma pack(2)
struct Foo{
	int a;
	union U{
		
	};
	
};
int main()
{
	printf("%d\n",sizeof(Foo));
	system("pause");
	return 0;
}

 注意这里有一个陷阱,union没有声明变量,只有一个定义。所以输出结果为:4(仅为int的字节数)

 

4:

struct Foo{
	
};
union E{

};
int main()
{
	printf("%d\n",sizeof(struct Foo));
	printf("%d\n",sizeof(union E));
	system("pause");
	return 0;
}

 这样的话,输出都为1。

结果:

1

1

 

5:

struct Foo{
	union E{
        };
};

int main()
{
	printf("%d\n",sizeof(struct Foo));
	//printf("%d\n",sizeof(union E));
	system("pause");
	return 0;
}

 结果:

1

反之将struct放进union中也是一样。甚至改成:

struct Foo{
	
}s;
union E{

}e;

 sizeof(e)和sizeof(s)也是1。

 

6:接下来言归正传,##pragma pack(n)有时候是会失效的(在n>struct成员占位最大的那个值的时候失效)。比如:

#pragma pack(4)
struct Foo{
	char a;
	char b;
	char v;
};
int main()
{
	printf("%d\n",sizeof(Foo));
	system("pause");
	return 0;
}

 

因为,结构体最大的占位成员占1字节,所以#pragma pack(4)失效。按照1字节对齐,输出结果:

3

所以只有在n>struct成员占位最大的那个值的时候(对于数组结构,只取其一个元素所占的大小进行比较),#pragma pack(n)才会有效。

比如:

#pragma pack(4)
struct Foo{
	double b;
	char a;
	char c;
};
int main()
{
	printf("%d\n",sizeof(Foo));
	system("pause");
	return 0;
}

 运行结果是:

12

 

7:函数和类型重定义不占空间,比如:

struct Foo{
	void foo(int a){}         //不带分号
	typedef int INT;          //带分号
};
int main()
{
	printf("%d\n",sizeof(Foo));
	system("pause");
	return 0;
}

 结果:

1

 

8:enum的声明是不占字节的。enum变量占四个字节。

struct Foo{
	enum Color{a,b} f;
};

int main()
{
	printf("%d\n",sizeof(struct Foo));
	system("pause");
	return 0;
}
//结果
4

 

 

struct Foo{
	enum Color{a,b};
};

int main()
{
	printf("%d\n",sizeof(struct Foo));
	system("pause");
	return 0;
}
//结果
1

 

enum Kala{fa,faa,faaa};
int main()
{
	printf("%d\n",sizeof(enum Kala));
	system("pause");
	return 0;
}
//结果
4

 

9:好了先到这里,看一个题:

猜猜下面sizeof(Foo)输出多少?

#pragma pack(2) 
struct Foo
{ 
    int i; 
    union U 
    { 
        char buff[13]; 
        int i; 
    }u; 
    void foo() {    } 
    typedef char* (*f)(void*); 
    enum{red, green, blue} color; 
}; 
int main()
{
	printf("%d\n",sizeof(struct Foo));
	system("pause");
	return 0;
}
//结果:
22(4+13+1+4)

 

分享到:
评论

相关推荐

    sizeof(结构体)和内存对齐

    sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐是C语言中一个重要的概念,它们之间存在着紧密的联系。sizeof(结构体)是指结构体在内存中的大小,而内存对齐是指编译器为了提高程序的效率和可移植性,对内存...

    sizeof与结构体和共同体.PDF

    sizeof与结构体和共同体.PDF 特别特别难找的一本书,不下会后悔的

    sizeof进行结构体大小的判断.

    sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.

    sizeof求struct结构体内存大小的问题

    通过深入理解`sizeof`和`struct`结构体的内存对齐,开发者可以更好地控制内存使用,避免潜在的性能瓶颈,并优化代码的移植性。在实际编程中,尤其是涉及网络通信、数据序列化或硬件交互时,结构体的内存布局就显得尤...

    一种快速清空结构体的方法

    // 将结构体的起始地址进行强制转型,传入起始地址,用sizeof函数求出结构体的大小。} 这个算法比较简单,也没什么含量。但是希望大家有什么好的算法,也分享出来给大家,大家一起学习进步。

    定义嵌套结构体数组

    这可能会影响到结构体的实际大小,可以通过 sizeof 操作符来获取结构体所占的字节数。 例如,我们可以这样显示 `Student` 结构体的大小: ```c #include int main() { printf("Size of struct Student: %ld ...

    关于结构体指针类型的强制转换

    void* p2 = malloc(sizeof(struct GPIO_TypeDef)); struct GPIO_TypeDef *p1 = (struct GPIO_TypeDef *)p2; ``` 2. **在STM32中的应用**:在STM32的开发中,可能会遇到需要从一个地址读取GPIO外设信息的情况。...

    C#结构体指针的定义及使用详解

    IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(vga)); Marshal.StructureToPtr(vga, intptr, true); // 将结构体复制到非托管内存 // 在此发送 intptr 指针给目的方 Marshal.FreeHGlobal(intptr); // 释放...

    解析C语言中的sizeof.rar

    `sizeof`也可以用于结构体或联合体类型。当应用于结构体时,它会返回整个结构体所占用的内存大小。结构体的大小是其所有成员大小之和,加上可能的对齐填充。例如: ```c struct MyStruct { char c; int i; }; ...

    向文件写结构体,或从文件读取结构体 VC

    注意,读取的数据量应该与写入时相同,即`sizeof(结构体类型)`: ```cpp Student s; inFile.read(reinterpret_cast*&gt;(&s), sizeof(s)); ``` 读取多个结构体时,同样用循环来遍历文件: ```cpp while (inFile.read...

    用结构体的方式来操作单片机内eeprom进行数据掉电保存.pdf

    ### 三、示例代码分析 #### 示例代码: ```c // 定义结构体类型 typedef struct { uint8_t uint8_t_d; uint16_t uint16_t_d; uint32_t uint32_t_d; int8_t int8_t_d; int16_t int16_t_d; int32_t int32_t_d;...

    C++sizeof使用规则及陷阱分析

    ### C++ `sizeof` 使用规则及陷阱分析 #### 一、`sizeof` 概念介绍 在C++中,`sizeof` 是一个关键字,用于获取变量或类型(包括聚合类型)所占用的存储空间大小(以字节为单位)。这个关键字返回一个 `size_t` ...

    C语言 结构体和指针详解及简单示例

    i &lt; sizeof(stus) / sizeof(struct stu); i++) { printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", ps[i].name, ps[i].num, ps[i].age, ps[i].group, ps[i].score); } ``` 以上就是C语言中关于...

    结构体

    `sizeof`运算符用于获取结构体或变量在内存中占用的字节数,这对于内存管理、计算数组大小等操作非常有用。例如`sizeof(struct cat)`会返回`cat`结构体的总大小。 7. **结构体变量赋值**: 同类型的结构体变量...

    结构体内存对其计算结构体大小

    在实际编程中,我们可以通过预处理器宏来获取结构体的大小,例如在C/C++中使用`sizeof`运算符: ```c printf("Size of MyStruct: %zu\n", sizeof(struct MyStruct)); ``` 这将输出结构体`MyStruct`的实际大小,包括...

    C#byte数组结构体互相转换示例.zip

    这里使用了`Marshal.SizeOf`计算结构体的大小,并通过`Marshal.StructureToPtr`将结构体复制到内存的字节数组中。 3. **字节数组转结构体**:创建一个方法将字节数组还原为结构体。 ```csharp public static ...

    sizeof计算struct大小

    在 C 语言中,sizeof 运算符可以应用于变量、数组、结构体、联合体、枚举类型等各种数据类型。sizeof 运算符的结果是变量或类型的大小,以字节为单位。 在结构体中,sizeof 不是成员类型大小的简单相加。计算结构体...

    C语言程序(结构体)

    struct Student* s1 = (struct Student*)malloc(sizeof(struct Student)); s1-&gt;name = "张三"; s1-&gt;age = 20; s1-&gt;score = 90.5; ``` 这里使用 `malloc` 函数动态地为 `Student` 结构体分配内存。记得在不再需要...

    c#结构体和byte之间的转换

    int size = Marshal.SizeOf(myStruct); byte[] bytes = new byte[size]; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { IntPtr ptr = handle.AddrOfPinnedObject(); Marshal....

    sizeof详细总结

    本文将对 sizeof 操作符进行详细的总结,包括其定义、语法形式、基本数据类型的 sizeof 值、指针变量的 sizeof 值、数组的 sizeof 值、结构体的 sizeof 值等。 定义和语法 sizeof 操作符的定义是:The sizeof ...

Global site tag (gtag.js) - Google Analytics