C语言:结构体基本使用、结构体常见赋值问题及解决、结构体偏移量、内存对齐问题、结构体与一级。。。

C语⾔:结构体基本使⽤、结构体常见赋值问题及解决、结构体偏移量、内存对
齐问题、结构体与⼀级。。。
⽂章可能⽐较长,如果想仔细了解结构体知识的话请⼤佬们耐⼼看完。
⽂章⽬录
⼀、结构体基本使⽤
基本规则与使⽤⽅法:
1.正常结构体定义时不能赋初值;
struct Person
{
char name[64];
//int age = 50;//定义时不能赋初值,只有使⽤变量时才赋初值。
int age;
};
2.使⽤typedef对结构体取别名;
typedef struct Person
{
char name[64];
江西医学院学报
int age;
}MyPerson;//MyPerson为struct Person类型的别名;
void test()
{
MyPerson p ={"aaa",10};//可以直接⽤别名使⽤;
}
3.没有写时typedef是定义了⼀个结构体变量(与上⾯对⽐),可以对其直接使⽤;
struct Person
{
char name[64];
int age;
}MyPerson ={"⼩⽶",200};//定义了⼀个结构体变量,可以直接使⽤
void test()
{
printf("姓名:%s 年龄:%d\n",MyPerson.name,MyPerson.age);
}
输出结果:
4.匿名类型下创建⼀个结构体变量,只有⼀个MyPerson3结构体变量可以使⽤,⽆法创建新的变量,也可对其直接使⽤;局限性强,基本不会使⽤。
struct
{
应力分析软件char name[64];
int age;
}MyPerson3 ={"⼩⽩",30};
void test()
{
printf("姓名:%s 年龄:%d\n",MyPerson3.name,MyPerson3.age); }
输出结果:
5.在栈区与堆区创建结构体变量;
void test()
{
//在栈上创建结构体
食品价格连续上涨
struct Person p1 ={"aaa",10};
//在堆区创建结构体变量
struct Person* p2 =(struct Person*)malloc(sizeof(struct Person)); p2->age =66;
strcpy(p2->name,"bbb");
}
6.在栈上与堆上创建结构体变量数组;
typedef struct Person
{
char name[64];
int age;
}MyPerson;
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 test()
{
//在栈上创建结构体变量数组
struct Person persons[]=
{
{"aaa",10},
{"bbb",20},
{"ccc",30},
{"ddd",40}
};
int len =sizeof(persons)/sizeof(struct Person);
PrintArray(persons,len);
//在堆区创建结构体变量数组
struct Person* personArr =(struct Person*)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;
}
}
打印结果:输出成功。
⼆、结构体常见赋值问题及解决
结构体常见赋值问题以及解决:
1.结构体变量赋值问题:在栈上开辟内存 : 将p2赋值给了p1
struct Person
{
char name[64];
int age;
};
void test()
{
struct Person p1 ={"Tom",20};
struct Person p2 ={"Jerry",18};
p1 = p2;//将p2赋值给p1
printf("p1的姓名:%s p1的年龄:%d\n",p1.name,p1.age);
printf("p2的姓名:%s p2的年龄:%d\n",p2.name,p2.age);
}
那么系统做了什么操作呢?
系统提供了浅拷贝操作,将p2每个字节拷贝到p1上,拷贝成功。
输出结果:赋值成功;
2.结构体变量赋值问题:在堆区开辟内存(浅拷贝出现的问题) :
若将上⾯代码改为如下代码:
struct Person2
{
char* name;
int age;
};
void test2()
{
struct Person2 p1;
p1.age =18;
p1.name =(char*)malloc(sizeof(char)*64);
strcpy(p1.name,"Tom");
struct Person2 p2;
p2.age =20;
p2.name =(char*)malloc(sizeof(char)*128);
strcpy(p2.name,"Jerry");
printf("p1的姓名:%s p1的年龄:%d\n",p1.name,p1.age);
printf("p2的姓名:%s p2的年龄:%d\n",p2.name,p2.age);
}
先打印⼀下,打印成功。
此时,我们再将p2赋值给p1。
p1 = p2;//p2赋值给p1
空心玻璃砖
再打印⼀下:还是没问题的
但是我们此时是在堆区开辟的内存,需要⼿动释放(堆区才会出现的问题,栈区不会出现该问题),我们执⾏如下代码后。
if(p1.name !=NULL)
{
free(p1.name);
p1.name =NULL;
}
if(p2.name !=NULL)
{
free(p2.name);
p2.name =NULL;
}
偷车贼2

本文发布于:2024-09-21 02:48:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/361358.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   问题   变量   创建
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议