sizeof()学习记录
1 问题引出
在学习“二进制文件操作”时,书中有这么一个例程:
1 #include <iostream>
2 #include <fstream>
3 using namespace std;
4
5 struct student
6 {
7 char name[20];
8 int num;
9 char sex;
10 int age;
11 };
12
13 int main()
14 {
15 student stud[3] = {"li", 1001, 'f', 18, "fun", 1002, 'm', 19, "wang", 1004, 'm', 17};
16 ofstream outfile("stud.dat", ios::binary);
17 if(!outfile)
18 {
19 cerr << "open error!" << endl;
20 abort();//退出程序
21 }
22 for(int i = 0; i < 3; i++)
23 {
24 outfile.write((char*)&stud[i], sizeof(stud[i]));
25 }
26 outfile.close();
27 return 0;
28 }
用记事本打开,显示乱码,如下所示:
用16进制格式打开,如下所示:
从上图中可以看出,给结构体分配的空间是4的倍数。
当把结构体修改一下:
1 struct student
2 {
3 char name[15];
4 char sex;
5 int num;
6 int age;
7 };
结构体分配的空间如下图所示:
2 测试用例
1 typedef struct MyStruct 2 { 3 short a; 4 int a1; 5 double i; 6 }test; 7 8 cout << sizeof(test) << endl;
1 struct HisStruct 2 { 3 unsigned aa; 4 char bb[1]; 5 double cc; 6 short dd; 7 }; 8 9 cout << sizeof(
HisStruct
) << endl;
1 struct HisStruct 2 { 3 unsigned aa; 4 char bb[1]; 5 int c; 6 int d; 7 //double cc; 8 short dd; 9 }; 10 11 cout << sizeof(struct HisStruct) << endl;
1 typedef struct MyStruct 2 { 3 short a; 4 short a1; 5 short a2; 6 }test; 7 8 cout << sizeof(test) << endl;
1 typedef struct MyStruct 2 { 3 char a; 4 }test; 5 cout << sizeof(test) << endl;
1 typedef struct MyStruct 2 { 3 char a; 4 char a1; 5 char a2; 6 }test;
1 typedef struct MyStruct 2 { 3 char a; 4 double c; 5 char a1; 6 char a2; 7 }test;
总结:以结构体内最大数据类型的字节数进行补齐。