#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //1.这样只是定义了一个结构体没有分配内存 typedef struct _Teacher { char name[69]; int age; }Teacher; //可以进行复制 void cpStruct(Teacher *p1, Teacher *p2) { *p1 = *p2; } void cpStruct01(Teacher to, Teacher from) { to = from; } int main() { Teacher tl;//分配内存这里栈的 strcpy(tl.name, "aaaaaa"); tl.age = 22; Teacher *p = (struct Teacher *)malloc(sizeof(Teacher));//这里是动态分配到堆上面 //p->age = 10;//就是在结构体的内存中,相对结构体内存的偏移量(实际就是模具盒子的大小取数值) //只有等号才进行操作内存 //所以我们在p->age的时候是不用操作内存的 //所以p->age;是能正常的编译通过 //strcpy(p->name, "Hello"); //printf("name = %s,age = %d\n", p->name, p->age); //2.释放的时候直接捆绑的释放 //cpu进行寻址读取内存的时候都是4个字节或者8个字节的读取所以上面的数据都是4的倍数 //printf("%d\n", sizeof(Teacher));//我们可以看到是76个字节但是我们加的时候只有74个字节 free(p); //3.编译器对结构体的拷贝行为 Teacher t2; //t2 = tl; cpStruct(&t2, &tl);//证明我们可以进行复制 //cpStruct01(t2,tl); printf("name = %s,age = %d\n", t2.name, t2.age); system("pause"); return 0; } 下面是完整的代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //1.这样只是定义了一个结构体没有分配内存 typedef struct _Teacher { char name[69]; int age; }Teacher; //可以进行复制 void cpStruct(Teacher *p1, Teacher *p2) { *p1 = *p2; } void cpStruct01(Teacher to, Teacher from) { to = from; } int main() { Teacher tl;//分配内存这里栈的 strcpy(tl.name, "aaaaaa"); tl.age = 22; Teacher *p = (struct Teacher *)malloc(sizeof(Teacher));//这里是动态分配到堆上面 p->age = 10;//就是在结构体的内存中,相对结构体内存的偏移量(实际就是模具盒子的大小取数值) //只有等号才进行操作内存 //所以我们在p->age的时候是不用操作内存的 //所以p->age;是能正常的编译通过 strcpy(p->name, "Hello"); //printf("name = %s,age = %d\n", p->name, p->age); //2.释放的时候直接捆绑的释放 //cpu进行寻址读取内存的时候都是4个字节或者8个字节的读取所以上面的数据都是4的倍数 //printf("%d\n", sizeof(Teacher));//我们可以看到是76个字节但是我们加的时候只有74个字节 //3.编译器对结构体的拷贝行为 Teacher t2; //t2 = tl; cpStruct(&t2, p);//证明我们可以进行复制 //cpStruct01(t2,tl); printf("name = %s,age = %d\n", p->name, p->age); if (p != NULL) { free(p); p = NULL; } system("pause"); return 0; }
结构体的基本操作-结构体作为函数的参数
最新推荐文章于 2022-10-06 15:57:06 发布