结构体定义
struct tag // struct 关键字 , tag 结构体的标志
{
member_list; // 结构体成员
}variable_list; // 结构体声明的变量
- 在结构体及其成员在结构体定义的时候不会分配内存空间,只有结构体变量才分配地址
- 结构体不能进行强制转换,但结构体指针可以
结构体定义形式
struct stu
{
char name[10];
int age ;
};
struct stu stu1 ; // 定义结构体变量
struct
{
char name[10];
int age ;
}stu1,stu2;
// 直接定义了stu1和stu2两个结构体变量并分配内存空间
// 但是除非使用typeof,不然不能再定义新的变量
typeof(stu1) STU3 ; // 定义了新的结构体变量STU3
struct stu
{
char name[10];
int age;
}stu1; // 直接定义了结构体变量stu1
struct stu stu2 ; // 定义结构体变量stu2
typedef struct stu
{
char name[10];
int age;
}STU;
STU stu1;
struct stu stu2 ;
typedef struct
{
char name[10];
int age;
}STU; // 并没有为STU分配内存
STU stu1;
内存分配
对其原则
- 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上空字节
- 结构体大小为最宽基本类型的整数倍
- 不同的定义顺序,不同的内存分配
struct stu
{
char aa; // aaaa aaaa 0000 0000 1个字节 其余补0
int age; // iiii iiii iiii iiii 2个字节
char bb; // bbbb bbbb 0000 0000 1个字节 其余补0
];
struct stu
{
int age; // iiii iiii iiii iiii 2个字节
char aa; // aaaa aaaa bbbb bbbb 2个字节
char bb;
];
谨防字符串覆盖其他成员
当输入的字符串个数多余字符串分配的内存时就会出现越界情况,如果后面有其他变量的定义,则会出现覆盖情况
typedef struct
{
char name[4];
int age;
}STU;
STU stu1 = {"TOMEA",20};
// stu1.name = "TOME", stu1.age = 20
STU stu2;
stu2.age = 20 ;
strcpy(stu2.name,"tomea" ) ;
// stu1.name = "TOMEA", stu1.age = 97