Week2-内存管理和结构体的学习

作用域

1.全局变量
①作用域:函数内部
②生命周期:从局部变量创建到函数结束
③存储位置:栈区
2.局部变量
①作用域:项目中所有文件
②生命周期:从程序创建到程序销毁
③存储位置:数据区
3.静态全局变量
①作用域:函数内部
②生命周期:从程序创建到程序销毁
③存储位置:数据区
4.静态局部变量
①作用域:定义所在文件中
②生命周期:从程序创建到程序销毁
③存储位置:数据区
5.全局函数
①作用域:项目中所有文件
②生命周期:从程序创建到程序销毁
③存储位置:代码区
6.静态函数
①作用域:定义所在文件中
②生命周期:从程序创建到程序销毁
③存储位置:代码区

内存模型

1.代码区
程序执行二进制代码(程序指令)(共享、只读)
2.数据区
①初始化数据区(data)
②未初始化数据区(bss)
③常量区
3.栈区:
系统为每一个程序分配一个临时的空间
存储内容:局部变量、函数信息、函数参数、数组
栈区大小:1M
(注意:在windows中可以扩展到10M,在linux中可以扩展到16M)
4.堆区
存储内容:大数据、图片、音乐、视频
(补充:堆区容量比较大,可以进行开辟和释放
手动开辟用malloc ,手动释放 用free)
各个区的内存位置如图
在这里插入图片描述
堆空间到开辟(malloc)和释放(free)示例:

void main()
{
	//开辟对空间存储数据
	int* p = (int*)malloc(sizeof(int));
	printf("%p\n", p);
	//使用堆空间
	*p = 123;
	printf("%d\n", *p);
	//释放堆空间
	free(p);
}

内存空间处理函数

1.memset:重置内存地址
2.memcpy:内存拷贝
3.memmove:内存拷贝(跟mencpy拷贝方式不同,这个是一个一个移除添加来完成拷贝工作的,memcpy是直接全部替换)
4.mencmp:内存比较

结构体

1.格式

struct 结构体名
{
	姓名
	年龄
	成绩
};

示例1(结构体简单使用)

struct student
{
	char name[21];
	int age;
	int score;
	char addr[51];
};
void main()
{
	struct student stu;
	strcpy(stu.name, "张三");
		stu.age = 10;
	stu.score = 90;
	strcpy(stu.addr, "广东揭阳");
	//或者struct student stu={"张三",10,90,"广东揭阳"};
	printf("姓名:%s\n", stu.name);
	printf("年龄:%d\n", stu.age);
	printf("分数:%d\n", stu.score);
	printf("地址:%s\n", stu.addr);
}

运行结果
在这里插入图片描述
示例2(结构体数组)

struct student
{
	char name[21];
	int age;
	int score;
	char addr[51];
};
void main()
{
	struct student stu[2] =
	{
		{"张三",10,90,"广东揭阳"},
		{"李四",20,100,"广东惠州"}
	};
	printf("姓名:%s\n", stu[1].name);
	printf("年龄:%d\n", stu[1].age);
	printf("分数:%d\n", stu[1].score);
	printf("地址:%s\n", stu[1].addr);
}

运行结果
在这里插入图片描述
示例3(结构体嵌套)

struct scores
{
	int c1;
	int cpp;
	int cs;
};
struct student
{
	char name[21];
	int age;
	struct scores ss;
	char addr[51];
};
void main()
{
	struct student stu;
	strcpy(stu.name, "张三");
	stu.age = 20;
	stu.ss.c1 = 80;
	stu.ss.cpp = 86;
	stu.ss.cs = 90;
	strcpy(stu.addr, "广东揭阳");

	printf("%s\n %d\n %d\n %d\n %d\n %s\n", stu.name, stu.age, stu.ss.c1, stu.ss.cpp, stu.ss.cs, stu.addr);
}

运行结果
在这里插入图片描述
示例4(结构体和指针)

struct student
{
	char* name;
	int age;
	int* scores;
	char* addr;
};
void main()
{
	struct student stu;
	stu.name = (char*)malloc(sizeof(char) * 21);
	stu.scores = (int*)malloc(sizeof(int) * 3);
	stu.addr = (char*)malloc(sizeof(char) * 51);
	strcpy(stu.name, "张三");
	stu.age = 20;
	stu.scores[0] = 90;
	stu.scores[1] = 95;
	stu.scores[2] = 99;
	strcpy(stu.addr, "广东揭阳");

	printf("姓名:%s\n", stu.name);
	printf("年龄:%d\n", stu.age);
	printf("分数:%d\n", stu.scores[0]);
	printf("分数:%d\n", stu.scores[1]);
	printf("分数:%d\n", stu.scores[2]);
	printf("地址:%s\n", stu.addr);
}

运行结果
在这里插入图片描述

联合体(共用体)(union)
①联合体中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖
②联合体变量得地址和它的各成员变量的地址都是同一个地址
③联合体所占内存长度等于其最长成员的长度整数倍数

枚举

示例

enum Color
{
	red,blue,green,pink
}color;
void main()
{	
	int value;
	scanf_s("%d", & value);
	switch (color)
	{
	case red:
		printf("红色\n"); break;
	case blue:
		printf("蓝色\n"); break;
	case green:
		printf("绿色\n"); break;
	case pink:
		printf("粉色\n"); break;
	}
}

运行结果
在这里插入图片描述
转载至
在这里插入图片描述

http://blog.bools.cn/archives/209

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值