文章目录
一、什么是动态内存
用malloc举个例子:
二、为什么要有动态内存
现在开辟的数组大小过大,程序就栈溢出了。
三、栈、堆和静态区
可以用下面代码进行验证,不过在Windows上不好验证,最好是在Linux上进行验证。
#include <stdio.h>
#include <stdlib.h>
int g_val1;
int g_val2 = 100;
int main()
{
char* str = "abcdef";
int* p = (int*)malloc(sizeof(int) * 10);
printf("code:%p\n", main);
printf("read only:%p\n", str);
printf("init global value:%p\n", &g_val2);
printf("uninit global value:%p\n", &g_val1);
printf("stack:%p\n", &str);
return 0;
}
四、常见的内存错误及对策
4.1 指针没有指向一块合法的内存
4.2 为指针分配的内存太小
4.3 内存分配成功,但并未初始化
这个代码很容易理解,但是为什么我们能够用(NULL== p)来对指针进行合法判定呢?其实我们是无法对没有初始化的指针进行判定的:
所以对指针进行合法性判定是指能够被用户直接使用的,是应用层面上解决的。
所有的指针如果没有被直接使用,。应该设置未NULL(编程规范)
在函数内部,要对指针进行合法性判定,本质上是验证(指针!=NULL)
4.4 内存越界
通过上面可以看出这里内存已经越界了。但是并没有报错,所以内存越界并不一定会报错。
4.5 5 内存泄漏
4.6 内存已经被释放了,但是继续通过指针来试用
所以最好是就是将p置为空。
五、C中动态内存“管理”体现在哪
通过释放多于我们开辟的10空间,我们可以推论出申请的空间也是多于我们开辟的10个空间,那么多出来的空间是干什么的呢?是用来记录这次申请的更详细的信息。