关于c语言struct结构体详解

结构体定义

struct tag		// struct 关键字 , tag 结构体的标志
{
    
    
	member_list;	// 结构体成员
}variable_list;		// 结构体声明的变量
  1. 在结构体及其成员在结构体定义的时候不会分配内存空间,只有结构体变量才分配地址
  2. 结构体不能进行强制转换,但结构体指针可以

结构体定义形式

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;

内存分配

对其原则

  1. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上空字节
  2. 结构体大小为最宽基本类型的整数倍
  3. 不同的定义顺序,不同的内存分配
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

猜你喜欢

转载自blog.csdn.net/qq_45279570/article/details/107882213
今日推荐