自定义类型:结构体的内存对齐和传参问题

来源:互联网 发布:个人免费域名注册 编辑:程序博客网 时间:2024/05/16 17:47

结构体基础知识:

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。可以分为结构体指针类型、结构体数组类型`
eg:
struct Stu
{
char name[20];
int age;
double height;
char sex;
}a[20],*P;
注意末尾分号不能丢。


结构体的成员可以是标量、数组、指针、甚至是其他结构体。
结构体变量的成员是通过点操作符(.)访问的,点操作符接受两个操作数。
eg:
Struct Stu
{
char name[20];
int age
};
Struct S s;
strcpy(s.name,"lisi");
s.age=20;//使用.age访问s的成员。


结构体内存对齐
1.第一个成员在与结构体变量偏移量为0的地址处;
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数:编译器默认的对齐数与该成员大小的较小值
vs(8) ; li3nux(4)
3、结构体总大小为最大对齐数的整数倍(每个成员变量除了第一个成员都有一个对齐数)
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的大小就是所有最大对齐数的整数倍。
结构体的内存对齐是拿空间来换取时间的做法。

eg

:`1)struct S1    {        char c1;//1        int i;//3+4->8        char c2;//1->9    };//12    printf("%d\n",sizeof(struct S1));//12    2)struct S1    {        char c1;//1        char c2;//1        int i;//2+4    };//8    printf("%d\n",sizeof(struct S1));//8    3)struct S1    {        double d;//8        char c;//1        int i;//3+4    };//16    printf("%d\n",sizeof(struct S1));//16    4)    struct S4    {    char c1;//1    struct S1 s1;//7+16    double d;//8    };//32    printf("%d\n",sizeof(struct  S4));//32

结构体传参:

#include<stdio.h>#include<stdlib.h>    struct S    {        int data[1000];        int num;    };    struct S s={{1,2,3,4},1000};    //结构体传参    void print1(struct S s)    {    printf("%d\n",s.num);    }//结构体地址传参    void print2(struct S* ps)    {        printf("%d\n",ps->num);    }    int main()    {        print1(s);        print2(&s);        system("pause");        return 0;    }

结构体传参的时候,要传结构体的地址