结构体的基本概念
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct Person{
char name[64];
int age;//不要在定义结构体的时候赋初值
}myPerson;//myPerson是struct Person类型的别名
void test01(){
myPerson p = { "lll", 23 };
}
struct Person2{
char name[64];
int age;
} myPerson2={"222",23};
void test02(){
printf("姓名:%s 年龄 %d\n",myPerson2.name,myPerson2.age);
myPerson2.age = 100;
strcpy(myPerson2.name,"aaaa");
printf("姓名:%s 年龄 %d\n", myPerson2.name, myPerson2.age);
}
void test03(){
//在栈上创建结构体变量
struct Person p1 = {"ccc",23};
//在堆上创建结构体变量
struct Person *p2 = malloc(sizeof(struct Person));
p2->age = 100;
strcpy(p2->name,"ddddd");
printf("姓名:%s 年龄 %d\n",p2->name, p2->age);
}
void printArray(struct Person persons[],int len){
for (int i = 0; i < len; i++)
{
printf("姓名:%s,年龄:%d\n",persons[i].name,persons[i].age);
}
}
void test04(){
//结构体变量数组
//在栈上创建
struct Person persons[] =
{
{"aaaa",10},
{"bbb",20},
{"ccc",30},
{"ddd",40}
};
int len = sizeof(persons) / sizeof(struct Person);
printArray(persons,len);
//在堆区创建
struct Person *personArr = malloc(sizeof(struct Person)*4);
for (int i = 0; i < 4; i++)
{
sprintf(personArr[i].name,"name_%d",i);
personArr[i].age = i + 18;
}
printArray(personArr,4);
if (personArr!=NULL)
{
free(personArr);
personArr = NULL;
}
}
int main()
{
test03();
}
结构体赋值的问题
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct Person
{
char name[64];
int age;
};
void test01(){
struct Person p1 = {"Tom",18};
struct Person p2 = {"Jerry",20};
p1 = p2;
printf("p1的姓名:%s 年龄:%d\n",p1.name,p1.age); //Jerry 20
printf("p2的姓名:%s 年龄:%d\n", p2.name, p2.age); //Jerry 20
}
struct Person2
{
char *name;
int age;
};
void test02(){
struct Person2 p1;
p1.age = 18;
p1.name = malloc(sizeof(char)*64);
strcpy(p1.name,"Tom");
struct Person2 p2;
p2.age = 20;
p2.name = malloc(sizeof(char)*128);
strcpy(p2.name,"Jerry");
//p1 = p2;
//自己提供赋值操作 深拷贝
//先释放原有内容
if (p1.name!=NULL)
{
free(p1.name);
p1.name = NULL;
}
p1.name = malloc(strlen(p2.name)+1);
strcpy(p1.name,p2.name);
p1.age = p2.age;
printf("p1的姓名: %s 年龄: %d\n", p1.name, p1.age);
printf("p2的姓名: %s 年龄: %d\n", p2.name, p2.age);
if (p1.name!=NULL)
{
free(p1.name);
p1.name = NULL;
}
if (p2.name!=NULL)
{
free(p2.name);
p2.name = NULL;
}
}
int main()
{
test02();
return 0;
}
结构体嵌套一级指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct Person
{
char *name;
int age;
};
struct Person **allocateSpace(){
struct Person **pArray = malloc(sizeof(struct Person *)*3);
for (int i = 0; i < 3; i++)
{
//给每个结构体开辟内存
pArray[i] = malloc(sizeof(struct Person));
//给每个结构体的姓名开辟内存
pArray[i]->name = malloc(sizeof(char *)*64);
sprintf(pArray[i]->name,"name_%d",i);
pArray[i]->age = i + 20;
}
return pArray;
}
void printArray(struct Person **pArray,int len){
for (int i = 0; i < len; i++)
{
printf("姓名:%s 年龄%d\n",pArray[i]->name,pArray[i]->age);
}
}
void freeSpace(struct Person **pArray,int len){
for (int i = 0; i < len; i++)
{
//释放姓名
if (pArray[i]->name!=NULL)
{
printf("%s被释放了\n",pArray[i]->name);
free(pArray[i]->name);
pArray[i]->name = NULL;
}
//释放结构体
free(pArray[i]);
pArray[i] = NULL;
}
//释放数组
free(pArray);
pArray = NULL;
}
void test01(){
struct Person **pArray = NULL;//malloc(sizeof(struct Person *)*3);
pArray = allocateSpace();
printArray(pArray,3);
//释放内存
freeSpace(pArray,3);
pArray = NULL;
}
int main()
{
test01();
return 0;
}
结构体的偏移量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<stddef.h>
struct Person{
char a;//0-3
int b;//4-7
};
void test01(){
struct Person p1;
struct Person *p = &p1;
printf("b的偏移量为 :%d\n",(int)&(p->b)-(int)p);
printf("b的偏移量为:%d\n",offsetof(struct Person,b));
}
//通过偏移量 获取到数据
void test02(){
struct Person p1 = {'a',10};
printf("p.b=%d\n",*(int *)((char*)&p1+offsetof(struct Person,b)));
printf("p.b=%d\n",*(int *)((int*)&p1+1));
}
//结构体嵌套结构体
struct Person2{
char a;
int b;
struct Person c;
};
void test03(){
struct Person2 p = { 'a', 10, 'b',20 };
int offset1 = offsetof(struct Person2,c);
int offset2 = offsetof(struct Person,b);
//printf("%d\n %d\n",offset1,offset2);
printf("%d\n",*(int *)((char *)&p+offset1+offset2));
printf("%d\n",((struct Person *)((char*)&p+offset1))->b);
}
int main()
{
//test01();
//test02();
test03();
}