0
点赞
收藏
分享

微信扫一扫

结构体初步(day15)

MaxWen 2022-11-26 阅读 166

本次学习结构体的声明以及简单的嵌套,以及结构体在栈区的存储。

结构体基础设置

实例

struct stu 
{
char name[20];
int age;
char sex[20];
};

struct cla
{
int s_num;
char c_teacher[20];
struct stu s;
};

int main()
{
stu stu_1 = { {'A','B','C'},12,{'m','a','l','e'} };
printf("%s\n", stu_1.name);
printf("%s\n", stu_1.sex);

cla cla_1 = { 1,{'W','A','N','G'},stu_1 };
printf("%s\n", cla_1.c_teacher);
return 0;
}

注意:对字符数组赋值时有两种方式

char name[20] = “zhang san” ;

char name[20] = {'z','h','a','n','g',' ','s','a','n'};

但不能使用如下语法:

char name[20];
name[20] = “zhang san” ;

或者

char name[20];
name = “zhang san” ;

或者

char name[20];
name[20] = {'z','h','a','n','g',' ','s','a','n'};

原因如下

1)编译器会将所有的字符放入一个数组首元素首字节内,但不可能放得下,只能放入最后一个字符。

2)name是数组名,在此处使用时退化为指针。该指针指向的是数组在内存中开辟的的首元素地址,将字符内容直接赋值给一个指针显然会造成错误。

具体原因仍然不明。

这里可以用strcpy函数对字符数组进行赋值

结构体初步(day15)_main函数

结构体初步(day15)_main函数_02

char name[20];
strcpy(name,"zhangsan");//注意:strcpy函数会复制字符串的终止符。


结构体存储

实例

typedef struct stu
{
char name[20];
int age;
char sex[10];

}stu;
void printf_1(stu tmp)
{
printf("name;%s\n", tmp.name);
printf("age:%d\n", tmp.age);
printf("sex:%s\n", tmp.sex);
}
void printf_2(stu* ps)
{
printf("name;%s\n", ps->name);
printf("age:%d\n", ps->age);
printf("sex:%s\n", ps->sex);
}
int main()
{
stu s1 = { "张三",12,"男"};

printf_1(s1);
printf("\n%d\n", sizeof(s1));
printf("%d\n", sizeof(s1.name));
printf("%d\n", sizeof(s1.age));
printf("%d\n", sizeof(s1.sex));
printf("\n%p\n", &s1);
printf("%p\n", &s1.name);
printf("%p\n", &s1.age);
printf("%p\n", &s1.sex);
printf_2(&s1);
return 0;
}

结果

name;张三
age:12
sex:男

36
20
4
10

000000C7811CF648
000000C7811CF648
000000C7811CF65C
000000C7811CF660
name;张三
age:12
sex:男

从上面地址信息中可以得出以下结论:

1)创建的结构体为34个字节,但在内存中申请了36个字节,也就是多出了两个空字节,原因不明

2)结构体内,各类数据的内存空间是紧密连接的,首元素与结构体对齐,也就是多余的两个空字节在末尾处

问题

两个空字节成因不明。

压栈与出栈

结构体初步(day15)_main函数_03

压栈:进入一个元素

出栈:删除一个元素

栈区内存调用

结构体初步(day15)_压栈_04

函数传参时,函数参数是需要压栈的(实参在main函数处,型参在main函数上压栈,随后型参在调用函数内压栈),当使用结构体传参时,压栈造成内存空间大量被占用,所以处理结构体的函数优先考虑指针)。

举报

相关推荐

0 条评论