Linux学习(C语言学习之内存空间的使用)

在c语言对内存的使用上我们是按照下面的图上的顺序来学习的:
在这里插入图片描述
指针就是内存类型资源的地址;指针变量:存放指针这个概念的空间
C语言的编译器对指针这个特殊的概念是有两个疑问的?
1、分配一个空间,空间的大小要多大?
在32bit 的系统中,指针就是4个字节
2、空间里存放的地址,所指向内存的读取方法是什么?
用 char 去读一次只能读取一个字节,用 int 的去读一次可以读取四个字节
这两个问题是整个指针的学习过程中一直要思考的问题。
指针指向的内存空间,一定要保证合法性。
指针+修饰符:
const:常量、只读(不能被修改)
const char *p 只读不能改写
char *const p 指向固定的地址,地址中的内容是可以修改的
const char *const p 指向固定的地址,地址中的内容是不能修改的
volatile:防止优化指向内存地址
typedef:别名(一般用于结构体、数组等)
指针+运算符:
int *p;
p+1的意思是指向下一个存储空间单元
p++,p–改变的是地址的位置,指针访问的地址一直在更新
变量名[n],n表示标签号;这种方式称为地址内容的标签访问方式,目的就是取出标签里的内存值。
指针p[n]表示的是指向n所在的标签位置
(int *)A强制将A转化为整型
逻辑操作符:

< == !=

这些运算符通常会跟一个特殊值进行比较,比如:0x0地址的无效值,结束标志;指针必须是同类型的比较才有意义
多级指针:
不论是几级指针,最终的还是一个存放地址的空间
数组:内存分配的一种形式,定义一个空间;
空间有两个属性:
1、大小
2、读取方式
数组的形式为:数据类型 数组名[m] m的作用域是在申请空间的时候
在数组的赋值中{}代表的是一个空间,数组空间赋值的核心思想就是:逐一赋值;字符串的赋值中有一个重要的属性就是结尾一定要有一个‘\0’
如果一块空间是字符空间,那么赋值的时候就可以使用字符串拷贝函数,在字符串中出现0这个特殊值,函数就即将结束,strcpy()函数(拷贝函数,在工程中基本不用,因为存在内存泄漏的问题,如果检测不到‘\0’就会一直拷贝);memcpy()函数,可以限定拷贝的个数(个数代表的是字节),memcpy(等待存储的数组,已经存储的数组,个数*sizeof(数据的类型));
内存分布图:
——————————————————————————
内存空间 应用程序不能访问
———————————————————————————3G
栈空间 局部变量 RW
———————————————————————————
运行时的堆空间 malloc
———————————————————————————
全局的数据空间(初始化的,未初始化)static RW data bss
只读数据段 R text
代码段 R text
———————————————————————————
0x0
堆空间:运行时可以自由分配和释放的空间,生存周期由程序员管理
分配:
malloc(),一旦成功就返回分配好的地址给我们,我们只需要接收,对于这个新地址的读法,由程序员自己把握,输入参数指定分配的大小,单位就是B;
常用写法:char p; p=(char * )malloc(); if(p == NULL){ err };
malloc(n
sizeof(char))
释放:
free§;此函数就可以释放;如果开辟了空间之后我们没有释放那就有可能出现泄漏

猜你喜欢

转载自blog.csdn.net/weixin_42994525/article/details/82937835
今日推荐