结构体中的高级话题
1.结构体赋值操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
typedef struct {
char name[50];
int age;
} Student;
void main() {
Student stu1 = {"Darren", 24};
Student stu2 ;
stu2 = stu1; // 赋值的操作。Java中 stu2对象与stu1相等;
// C里面 = 相当于内容赋值操作。把stu1的值 一个个赋值给stu2. strcpy(destStr, souStr)
printf("%p, %p", &stu1, &stu2); // 打印地址,地址不相等。
getchar();
}
2.结构体套指针
结构体套指针,必须要对结构体指针进行初始化(赋值);
指针可以指向任何地址,但是他的大小永远是4字节。
typedef struct {
char* name; // 可以给name任何char*的值,但是结构体大小怎么计算。是个指针。
int age;
} Student;
void main() {
Student stu ={"jack", 11};
stu.name = "Darren"; // 1.将指针的指向常量区中的Darren
stu.name = malloc(sizeof(char)* 100); // 堆区申请内存
strcpy(stu.name, "Darren"); //2. 往stu.name 堆区内存里面拷贝数据Darren
stu.age = 44;
printf("%s, %d, %d", stu.name, stu.age, sizeof(stu) );
}
3.深拷贝和浅拷贝
传入地址可以完成里面对象的赋值,
void copyTo(Student *from, Student *to) {
*to = *from; // 浅拷贝,指针的赋值运算是一个浅拷贝。把指针的指向指在一起。
// 指针深拷贝:系统架构的圆形设计模式里面。
to->name = (char*)malloc(100);
strcpy(to->name, from->name); // 开辟内存,进行值的拷贝。
}
void main() {
Student stu1;
stu1.mame = malloc(sizeof(char)* 100);
strcpy(stu.name, "Darren");
Student stu2;
stu2.name = "jack";
stu2.age = 0;
copyTo(&stu1, &stu2); // 使用方法拷贝,传入地址
printf("age, %d, ",stu2.age);
//释放内存
if(stu1.name) {
free(stu1.name);
stu1.name=NULL; // 避免野指针
}
if(stu2.name) {
free(stu2.name);
free(stu2.name); // 释放出错
}
}
4.结构化的偏移量强化:字节对齐
struct date{ // 12字节 = 4+4+4字节
int year;
int month;
int day;
};
typedef struct student{ // 结构体嵌套。36个字节 = ????
int number;// 4
char sex;// 1字节,但是偏移量是4字节,因为要字节对齐(4的倍数)。
int age;// 4
char name[10];// 10,也要字节对齐,所以占12字节。 22/4不能整除。
struct date birthday;// 12
// 31%4 32%4 32字节? 还是36个字节 = 24+12
} student ;
void main() {
student* stu = NULL; // 首地址是0x000000
int size = sizeof(stu);
// 内部偏移量: &(stu->number):0, &(stu->sex):4, &(stu->age):8, &(stu->name)12, &(stu->birthday)24
printf("student name offset = %d", &(stu->name) );
}
结构体,内部偏移问题:
- 怎么获取内部元素的偏移量 &(stu->number) - (int)stu
- 获取结构体的大小 sizeof(student)
- 大小怎么来的? 根据每个的偏移量计算来的。最终要除模能整除。结构体的大小根数据变量的位置摆放有关。
字节对齐是针对后面的这个数据来看的。 - 把最小的字节数尽量的往后摆放。
结构体一旦定义了,不要轻易去挪动,因为我们只要知道内部任何一个变量的地址,那么就知道了整个结构体。
通过+-相关的偏移量,就能拿到其他变量的值。
碰到问题,用心去找问题。
网友评论