0
点赞
收藏
分享

微信扫一扫

【C语言深度剖析】第四篇:内存管理

耶也夜 2022-01-15 阅读 60

文章目录


一、什么是动态内存

用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个空间,那么多出来的空间是干什么的呢?是用来记录这次申请的更详细的信息。
在这里插入图片描述

举报

相关推荐

0 条评论