C/C++学习之内存

1、变量

1.1、局部变量

概念:定义在函数 内 部的变量。

作用域:从定义位置开始,到包裹该变量的第一个右大括号结束。

1.2、全局变量

概念:定义在函数外部的变量。

作用域:从定义位置开始,默认到本文件内部。 其他文件如果想使用,可以通过声明方式(extern)将作用域导出。

1.3、static全局变量

定义语法: 在全局变量定义之前添加 static 关键字。

作用域:被限制在本文件内部,不允许通过声明导出到其他文件。

1.4、static局部变量

定义语法: 在局部变量定义之前添加 static 关键字。

特性: 静态局部变量只定义一次。在全局位置。 通常用来做计数器。

作用域:从定义位置开始,到包裹该变量的第一个右大括号结束。
# 1 const关键字

1.5、修饰指针

const int *p;

	可以修改 p

	不可以修改 *p。

int const *p;

	同上。

int * const p;

	可以修改 *p

	不可以修改 p。

const int *const p;

	不可以修改 p。

	不可以修改 *p。

总结:const 向右修饰,被修饰的部分即为只读。

常用:在函数形参内,用来限制指针所对应的内存空间为只读。

2、函数

2.1、全局函数

定义语法: 函数原型 + 函数体

2.2、static函数

定义语法:static + 函数原型 + 函数体

static 函数 只能在 本文件内部使用。 其他文件即使声明也无效。

3、内存4区模型(代码段、数据段、stack、heap)

代码段:.text段。 程序源代码(二进制形式)。

数据段:只读数据段 .rodata段。初始化数据段 .data段。 未初始化数据段 .bss 段。

stack:栈。 在其之上开辟 栈帧。	windows 1M --- 10M	Linux: 8M --- 16M

heap:堆。 给用户自定义数据提供空间。 约 1.3G+

内存4区模型
内存4区模型

4、生命周期

局部变量:从变量定义开始,函数调用完成。 --- 函数内部。

全局变量:程序启动开始,程序终止结束。  --- 程序执行期间。

static局部变量:程序启动开始,程序终止结束。  --- 程序执行期间。

static全局变量:程序启动开始,程序终止结束。  --- 程序执行期间。

全局函数:程序启动开始,程序终止结束。  --- 程序执行期间。

static函数:程序启动开始,程序终止结束。  --- 程序执行期间。

5、heap (堆)空间

堆分配从低地址到高地址,栈高地址到低地址。

5.1、开辟释放 heap 空间

void *malloc(size_t size);  申请 size 大小的空间

	返回实际申请到的内存空间首地址。 【我们通常拿来当数组用】

void free(void *ptr);	释放申请的空间

	参数: malloc返回的地址值。
	int *p = (int *)malloc(sizeof(int) * 10);
	
	if (p == NULL)
	{
		printf("malloc error\n");
		return -1;
	}
	
	char *tmp = p;  // 记录malloc返回的地址值。用于free
	
	// 写数据到 malloc 空间。
	for (size_t i = 0; i < 10; i++)
	{
		p[i] = i + 10;
	}
	// 读出malloc空间中的数据
	//for (size_t i = 0; i < 10; i++)
	//{
	//	printf("%d ", *(p+i));
	//}
	for (size_t i = 0; i < 10; i++)
	{
		printf("%d ", *p);
		p++;
	}
	
	// 释放申请的内存。
	free(tmp);
	p = NULL;

5.2、使用 heap 空间

空间时连续。 当成数组使用。

free后的空间,不会立即失效。 通常将free后的 地址置为NULL。

free 地址必须 是 malloc申请地址。否则出错。

如果malloc之后的地址一定会变化,那么使用临时变量tmp 保存。

5.3、二级指针对应的 heap空间

申请外层指针: char **p = (char **)malloc(sizeof(char *) * 5);

申请内层指针: for(i = 0; i < 5; i++)
		{
			p[i] = (char *)malloc(sizeof(char) *10);
		}

使用: 不能修改 p 的值。

	 for(i = 0; i < 5; i++)
	{
		strcpy(p[i], "helloheap");
	}

释放内层:

	 for(i = 0; i < 5; i++)
	{
		free(p[i]);
	}

释放外层:

	free(p);

6、内存处理函数

6.1、memset()

void* memset(void* str,int value,size_t num)
按字节设置,进行赋值

功能:以str的起始位置开始的n个字节的内存区域用整数value进行填充

返回值:目标str内存起始地址

说明:

memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’

如果用malloc分配的内存,一般只能使用memset来初始化

memset可以方便的清空一个结构类型的变量或数组,它可以一字节一字节地把整个数组设置为一个指定的值

注意:	
	①memset可以重置内存区域的值  初始化值为0 但在char类型中可以初始化相同的值
	
  	②memset 重置内存的值,前提是重置区域可读可写

6.2、memcpy()

void* memcpy(void* dest,const void* src,size_t num)

功能:函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置

说明:
	这个函数在遇到’\0’不会停下来
	源地址与目标地址不能发生重叠
	
strcpy 与mencpy的不同

①函数参数不同
②strcpy拷贝字符串  memcpy 可以拷贝一块内存
③strcpy与memcpy拷贝结束标志不同

6.3、memmove()

void* memmove(void* dest,const void* src,size_t num)

功能:memmove()功能用法和memcpy()一样,

区别在于:dest和src所指的内存空间重叠时,memmove()仍然能处理,不过执行效率比memcpy()低些。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值