C基础3-内存管理-复合类型

1.作用域

1.1.局部变量

auto自动变量
在一个函数内定义,只在函数范围内有效
在复合语句中定义,只在复合语句中有效
随着函数调用的结束或复合语句的结束局部变量的声明声明周期也结束
如果没有赋初值,内容为随机

1.2.静态变量

static局部变量的作用域也是在定义的函数内有效
static局部变量的生命周期和程序运行周期一样,同时staitc局部变量的值只初始化一次,但可以赋值多次
static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符

void fun2()
{
	//静态局部变量,没有赋值,系统赋值为0,而且只会初始化一次
	static int a;
	a++;
	printf("a = %d\n", a);
}

1.3.全局变量

在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明
全局变量的生命周期和程序运行周期一样
不同文件的全局变量不可重名

1.4.静态(static)全局变量

在函数外定义,作用范围被限制在所定义的文件中
不同文件静态全局变量可以重名,但作用域不冲突
static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次

1.5 总结

类型作用域生命周期
auto变量一对{}内当前函数
static局部变量一对{}内整个程序运行期
extern变量整个程序整个程序运行期
static全局变量当前文件整个程序运行期
extern函数整个程序整个程序运行期
static函数当前文件整个程序运行期
register变量一对{}内当前函数
全局变量整个程序整个程序运行期

2.内存布局

C代码经过预处理、编译、汇编、链接4步后生成一个可执行程序。
没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分
在这里插入图片描述

2.1.代码区(text)

存放 CPU 执行的机器指令。通常代码区是可共享的 ,对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。

2.2.全局初始化数据区/静态数据区(data段)

该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)

2.3.未初始化数据区( bss 区)

存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)

2.4.内存操作函数
void *memset(void *s, int c, size_t n);
功能:将s的内存区域的前n个字节以参数c填入

void *memcpy(void *dest, const void *src, size_t n);
功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上。

memmove()

int memcmp(const void *s1, const void *s2, size_t n);
功能:比较s1和s2所指向内存区域的前n个字节

void *malloc(size_t size);
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定,一般使用memset初始化。

void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。

3.复合类型

3.1结构体struct

表达拥有多个属性的事物对象。类似Java的对象。

//定义结构体
struct stu
{
	char name[50];
	int age;
};
//声明
struct stu s1;

//如果是普通变量,通过点运算符操作结构体成员
strcpy(s1.name, "abc");
s1.age = 18;
printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);
3.1结构体struct嵌套
struct person
{
	char name[20];
	char sex;
};

struct stu
{
	int id;
	struct person info;
};
//赋值
struct stu stu[2] = { 1, "lily", 'F', 2, "yuri", 'M' };
3.1结构体、指针
struct stu s1 = { "lily", 18 };

//如果是指针变量,通过->操作结构体成员
struct stu *p = &s1;

使用指针给结构体赋值

//结构体类型的定义
struct stu
{
	char name[50];
	int age;
};
struct stu *p = NULL;

p = (struct stu *)malloc(sizeof(struct  stu));

//如果是指针变量,通过->操作结构体成员
strcpy(p->name, "test");
p->age = 22;

3.1共用体(联合体)

联合union是一个能在同一个存储空间存储不同类型数据的类型;
联合体所占的内存长度等于其最长成员的长度,也有叫做共用体;
同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用
共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖;
共用体变量的地址和它的各成员的地址都是同一地址。

3.1枚举

在枚举值表中应列出所有可用值,也称为枚举元素。
枚举值是常量,不能在程序中用赋值语句再对它赋值。
举元素本身由系统定义了一个表示序号的数值从0开始顺序定义为0,1,2 …

3.1typedef

typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值