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;

 

 

 

总结:以结构体内最大数据类型的字节数进行补齐。

 

posted on 2020-08-01 12:21  辉哥54110  阅读(187)  评论(0编辑  收藏  举报