1.内存区域的划分(从高到低)
a.栈区 栈 (先进后出) 队列(先进先出)
b.堆区(重点)
c.静态区(全局区)只初始化一次;如果初始化没给值,系统默认为零;只有程序退出才释放
d.常量区 常量占用内存,只读状态,绝不可修改
e.代码区
2. 栈区 一个程序在内存中栈区大概分配7~8M的栈区内存,递归能很快的吃掉内存
3.局部变量存在于栈区,有系统为其分配空间和释放空间,开发人员不需要关系栈区的管理
4.常量区 (’a’,10,“iphone”,3.14),都存在于常量区,常量区的内容是不允许修改的,常量区的数据也是有系统分配的,不需要开发人员管理
5.静态区 (全局区)有static 修饰的变量存放在静态区,静态区的变量有一个特点整个程序运行过程中,只被初始化一次,如果没有初始化,系统会默认为0
6.代码区 程序中运行的函数 或者变量等一些其他的语句都会编译成cpu指令放在代码区;系统提供的函数由于使用比较频繁,我们把它存放在栈区,原因栈区的内容会被反复的创建销毁,不需要我们去管理内存,还有是因为栈区的内存开辟和释放都是非常迅速的
7. 堆区 是唯一一块开发者能够控制的内存区域,这块区域内存我们要手动申请,并且手动释放
malloc 代表申请内存的函数
void *malloc(size_t)
void *,泛类型,返回的指针可以赋值给任何类型的指针,eg:int*,float*,char*,short*
size_t代表申请多少个字节大小的内存空间
malloc的作用:申请size个字节大小的空间,并把申请空间的首地址返回
char *p = malloc(8);//p内存存储的是8个空间的首地址
//*p = "iphone";数组不能直接赋值
strcpy(p, "iphone");//往堆区空间存储字符串
printf("%s\n",p);
//*p = "iphone";数组不能直接赋值
strcpy(p, "iphone");//往堆区空间存储字符串
printf("%s\n",p);
8.free(p)
p =NULL 指向的无效空间,防止野指针错误
释放掉p指向的对去空间,只是标记删除,不清空里面的内容;过度释放,释放多次,过度释放会造成崩溃
9.其他的内存分配函数
calloc(n,4)表示:两个参数的意思,申请n个size大小的空间,返回时申请空间的首地址,但是它在申请空间的时候会多做一个处理,清除每一个字节里的内存,也就是清零操作,正式因为calloc多了一步轻灵的操作,执行效率要比malloc低
10.relloc(p,n)内存的重新分配函数,第一个参数是地址,第二个参数重新分配的内存大小;使用relloc重新分配空间的时候,如果在原有空间的基础上可以连续在增加(n -原来空间大小)的空间,指针的指向不会改变,如果这时不可以连续增加(n-原来空间的大小),会将之前的空间给释放掉,然后,再去堆区的其他位置开辟连续的n个空间大小的内存,指针的指向发生改变了
int *p = malloc(12);
*p = 10;
*(p+1) = 20;
*(p+2) = 30;
printf("之前的地址%p\n",p);
p = realloc(p, 20);//重新申请空间的大小
printf("之后的地址%p\n",p);
*(p+3) = 40;
*(p+4) = 50;
//重新分配的空间会把之前的空间里的内容给拷贝过来,放到相应的位置
for (int i =0; i < 5; i++) {
printf("%d\t",*(p+i));
}
free(p);
p = NULL;
*p = 10;
*(p+1) = 20;
*(p+2) = 30;
printf("之前的地址%p\n",p);
p = realloc(p, 20);//重新申请空间的大小
printf("之后的地址%p\n",p);
*(p+3) = 40;
*(p+4) = 50;
//重新分配的空间会把之前的空间里的内容给拷贝过来,放到相应的位置
for (int i =0; i < 5; i++) {
printf("%d\t",*(p+i));
}
free(p);
p = NULL;
11.memset(开始地址,n,size);给定一个开始地址,将size的空间大小的数据视为n,如果n为零,size为10,就是把10个字节中的数据视为0;
int *p7 = malloc(12);
memset(p7, 1, 4);
memset(p7, 1, 4);
printf("%d\n",*p7);
char *p7 = malloc(4);
memset(p7, 97, 2);
printf("%c\n",*p7);
printf("%c\n",*(p7+1));
11.memcpy(dest,source,n)从原指针开始向目的指针拷贝n个字节的数据
char str1[] ="ABC";
char str2[] ="123";
memcpy(str1, str2, 2);
char str2[] ="123";
memcpy(str1, str2, 2);
printf("%s\n",str1);
12.memcmp(p1,p2,n);比较p1和p2指向内存里的内存是否相同,比较n个字节,返回值是0,相等,不同的时候,返回差值;比较的过程是追个字节比较,返回第一对对应字节的位置不相同数据的差值
一个字节表示范围(
-256~255
)这是有符号的
无符号的字节范围(
0~255
int *p8 = malloc(4);
*p8 = 260;
int *p9 = malloc(4);
*p9 = 772;
int result = memcmp(p8, p9, 2);
printf("%d\n",result);
free(p8);
p8 =NULL;
free(p9);
p9=NULL;
int *p9 = malloc(4);
*p9 = 772;
int result = memcmp(p8, p9, 2);
printf("%d\n",result);
free(p8);
p8 =NULL;
free(p9);
p9=NULL;
13.被static修饰的全局变量,生命周期随着程序的创建而创建,随着程序的消失而消失