前几天老师留了一个程序题如下:
结合百度百科的解释和调试,自己的理解如下:
1. 首先提到一个数,这个数跟结构体有关,假设为offsetNum. 当使用了#pragma pack(n)时,offsetNum=min(n,所有类型或结构体的offsetNum)是可以嵌套使用的.其中基本类型short,int,float,double等的offsetNum = sizeof(基本类型),
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* ss1 = "0123456789";
char ss2[] = "0123456789";
char ss3[100] = "0123456789";
int ss4[100];
char q1[] = "abc";
char q2[] = "a\n";
char* q3 = "a\n";
char *str1 = (char*) malloc(100);
void *str2 = (void*) malloc(100);
printf("sizeof(ss1) is %d\n", sizeof(ss1));
printf("sizeof(ss2) is %d\n", sizeof(ss2));
printf("sizeof(ss3) is %d\n", sizeof(ss3));
printf("sizeof(ss4) is %d\n", sizeof(ss4));
printf("sizeof(q1) is %d\n", sizeof(q1));
printf("sizeof(q2) is %d\n", sizeof(q2));
printf("sizeof(q3) is %d\n", sizeof(q3));
printf("sizeof(str1) is %d\n", sizeof(str1));
printf("sizeof(str2) is %d\n", sizeof(str2));
free(str1);
free(str2);
return 0;
}
题目的具体输出结果,你可以运行一下。。然后自己再想一下就差不多了
看了题目之后,自己觉得挺迷茫的,于是就百度了一下sizeof函数,发现了struct的大小分配挺有意思的。。
于是自己就写了一段代码,貌似有点乱:
#include <stdio.h>
struct s1
{
char c;
double d;
int i;
};
struct s2
{
char c;
int i;
double d;
};
struct s3
{
char c;
struct s1 s;
};
struct s4
{
char c;
struct s2 s;
};
struct s5
{
char c;
char c1;
char c2;
};
#pragma pack(push)
#pragma pack(1)
struct ps1
{
char c;
double d;
int i;
};
struct ps2
{
char c;
int i;
double d;
};
struct ps3
{
char c;
struct ps1 s;
};
struct ps4
{
char c;
struct ps2 s;
};
struct ps5
{
char c;
char c1;
char c2;
};
struct ps6
{
char c;
struct s1 s;
};
struct ps7
{
char c;
struct s2 s;
};
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
struct ps8
{
char c;
struct s1 s;
char c1;
};
struct ps9
{
char c;
struct ps1 s;
};
struct ps10
{
int c;
struct s2 s;
};
struct ps11
{
int c;
struct ps2 s;
};
struct ps12
{
char c;
struct s5 s;
};
#pragma pack(pop)
//验证pragma的作用域
#pragma pack(push)
#pragma pack(4)
struct ps13
{
char c;
int i;
char c1;
double s;
double s1;
};
struct ps14
{
char c;
char c1;
int i;
double s;
double s1;
};
#pragma pack(pop)
struct ps16
{
int i;
double d;
struct ps13 s;
};
#pragma pack(push)
#pragma pack(2)
struct ps17
{
char c;
int i;
char c1;
double d;
double d1;
struct ps13 s;
struct s1 x;
};
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
struct ps19
{
char c;
int i;
char c1;
double d;
double d1;
};
#pragma pack(pop)
#pragma pack(push)
#pragma pack(4)
struct ps20
{
char c;
double d;
char x;
struct ps19 s;
};
#pragma pack(pop)
void main(){
struct s1 *s;
printf("sizeof(s1) = %d\n",sizeof(s1));
printf("sizeof(s1->c) = %d\n",sizeof(s->c));
printf("sizeof(s2) = %d\n",sizeof(s2));
printf("sizeof(s3) = %d\n",sizeof(s3));
printf("sizeof(s4) = %d\n",sizeof(s4));
printf("sizeof(s5) = %d\n",sizeof(s5));
printf("sizeof(ps1) = %d\n",sizeof(ps1));
printf("sizeof(ps2) = %d\n",sizeof(ps2));
printf("sizeof(ps3) = %d\n",sizeof(ps3));
printf("sizeof(ps4) = %d\n",sizeof(ps4));
printf("sizeof(ps5) = %d\n",sizeof(ps5));
printf("sizeof(ps6) = %d\n",sizeof(ps6));
printf("sizeof(ps7) = %d\n",sizeof(ps7));
printf("sizeof(ps8) = %d\n",sizeof(ps8));
printf("sizeof(ps9) = %d\n",sizeof(ps9));
printf("sizeof(ps10) = %d\n",sizeof(ps10));
printf("sizeof(ps11) = %d\n",sizeof(ps11));
printf("sizeof(ps12) = %d\n",sizeof(ps12));
printf("sizeof(ps13) = %d\n",sizeof(ps13));
printf("sizeof(ps14) = %d\n",sizeof(ps14));
printf("sizeof(ps16) = %d\n",sizeof(ps16));
printf("sizeof(ps17) = %d\n",sizeof(ps17));
printf("sizeof(ps20) = %d\n",sizeof(ps20));
printf("sizeof(ps20) = %d\n",sizeof(ps20));
}
结合百度百科的解释和调试,自己的理解如下:
1. 首先提到一个数,这个数跟结构体有关,假设为offsetNum. 当使用了#pragma pack(n)时,offsetNum=min(n,所有类型或结构体的offsetNum)是可以嵌套使用的.其中基本类型short,int,float,double等的offsetNum = sizeof(基本类型),
2.结构体中单个成员的空间分配顺序与其定义的顺序一致,并且其相对首地址的偏移量是min(n,该成员的offsetNum)的整数倍,不够的话用CC填充。
3.最终结构体的大小要是offsetNum的整数倍。。不够的话也用CC填充