本次学习结构体的声明以及简单的嵌套,以及结构体在栈区的存储。
结构体基础设置
实例
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函数对字符数组进行赋值
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)结构体内,各类数据的内存空间是紧密连接的,首元素与结构体对齐,也就是多余的两个空字节在末尾处
问题
两个空字节成因不明。
压栈与出栈
压栈:进入一个元素
出栈:删除一个元素
栈区内存调用
函数传参时,函数参数是需要压栈的(实参在main函数处,型参在main函数上压栈,随后型参在调用函数内压栈),当使用结构体传参时,压栈造成内存空间大量被占用,所以处理结构体的函数优先考虑指针)。
标签:char,20,name,stu,s1,初步,day15,printf,结构 From: https://blog.51cto.com/u_15862591/5889224