我是靠谱客的博主 冷艳篮球,最近开发中收集的这篇文章主要介绍C/C++学习之内存1、变量2、函数3、内存4区模型(代码段、数据段、stack、heap)4、生命周期5、heap (堆)空间6、内存处理函数,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
C/C++学习之内存
- 1、变量
- 1.1、局部变量
- 1.2、全局变量
- 1.3、static全局变量
- 1.4、static局部变量
- 1.5、修饰指针
- 2、函数
- 2.1、全局函数
- 2.2、static函数
- 3、内存4区模型(代码段、数据段、stack、heap)
- 4、生命周期
- 5、heap (堆)空间
- 5.1、开辟释放 heap 空间
- 5.2、使用 heap 空间
- 5.3、二级指针对应的 heap空间
- 6、内存处理函数
- 6.1、memset()
- 6.2、memcpy()
- 6.3、memmove()
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、生命周期
局部变量:从变量定义开始,函数调用完成。 --- 函数内部。
全局变量:程序启动开始,程序终止结束。 --- 程序执行期间。
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 errorn");
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的内存位置
说明:
这个函数在遇到’ ’不会停下来
源地址与目标地址不能发生重叠
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()低些。
最后
以上就是冷艳篮球为你收集整理的C/C++学习之内存1、变量2、函数3、内存4区模型(代码段、数据段、stack、heap)4、生命周期5、heap (堆)空间6、内存处理函数的全部内容,希望文章能够帮你解决C/C++学习之内存1、变量2、函数3、内存4区模型(代码段、数据段、stack、heap)4、生命周期5、heap (堆)空间6、内存处理函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复