首页 / C++ / C/C++学习之内存
C/C++学习之内存
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C/C++学习之内存,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4159字,纯文字阅读大概需要6分钟。
内容图文
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、生命周期
局部变量:从变量定义开始,函数调用完成。 --- 函数内部。
全局变量:程序启动开始,程序终止结束。 --- 程序执行期间。
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()低些。
内容总结
以上是互联网集市为您收集整理的C/C++学习之内存全部内容,希望文章能够帮你解决C/C++学习之内存所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。