C语言:动态内存管理

1.栈区空间较少
动态开辟数组

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ar[n];
	return 0;//c99标准
}

只可以开辟1024,即1M字节
动态在堆区开辟
在这里插入图片描述
2.malloc,calloc,realloc函数申请内存空间
无类型指针可以存放任何地址,要进行强转
malloc申请的所有空间都要释放
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分配空间时候有上下越界标志fd
free函数可执行
标志域位0,存储空间未用
标志域位1,存储空间已用

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
int main()
{
	int n = 5;
	//int* ip = (int*)malloc(4 * 5);
	int* ip = (int*)malloc(sizeof(int) * 5);
	if (ip == nullptr)exit(EXIT_FAILURE);
	for (int i = 0; i < n; ++i)
	{
		ip[i] = i + 10;
	}
	for (int i = 0; i < n; ++i)
	{
		printf("%5d", ip[i]);
	}
	free(ip);
	ip = nullptr;
	return 0;
}

对于系统开辟空间大小

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
int main()
{
	int* ip = (int*)malloc(sizeof(int));
	if (nullptr == ip) exit(EXIT_FAILURE);
	*ip = 100;
	printf("%d \n", *ip);
	free(ip);//空悬指针-失效指针
}

开辟的空间只用free一次,不一定每次都能申请到空间,有可能内存不足,返回空指针
3.释放字节个数如何计算?
(1)上下越界标志(各4字节)
(2)头部信息(约28字节):存放申请字节的个数(记录申请字节个数)向上偏移申请字节个数,malloc函数可以串接申请的函数字节,已用和未用标志malloc(sizeof(int*n)判空(申请所有空间全部释放)地址不可设置+±-;空指针可以直接释放
4.内存泄漏:
(1)未free申请字节
(2)指针丢失,地址丢失
(3)malloc开辟空间后,没有释放内存,程序运行过程中内存耗尽
5.calloc函数

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
void* my_calloc(size_t num, size_t size)
{
	void* vp = malloc(num * size);
	if (nullptr!= vp)
	{
		memset(vp, 0, num * size);
	}
	return vp;
}
int main()
{
	int n = 10;
	int* ip = (int*)malloc(sizeof(int) * n);

	if (nullptr == ip) exit(1);
	int* is = (int*)calloc(n, sizeof(int));
	int* rs = (int*)my_calloc(n, sizeof(int));

	free(ip);
	ip = nullptr;
	free(is);
	is = nullptr;
	return 0;
}

6.函数作用及差别

void * memcpy( void * destination, const void * source ,size_t num)
void * memmove( void * destination, const void * source ,size_t num);

7.malloc函数出现错误
(1)
在这里插入图片描述
内存泄漏,没有free释放
(2)
在这里插入图片描述
malloc申请空间没有判空
(3)在这里插入图片描述
free只能释放malloc,realloc,calloc函数开辟的空间,数组开辟的空间此函数不可以释放
(4)在这里插入图片描述
程序只能free释放一次空间
(5)在这里插入图片描述
malloc函数开辟的空间只能释放全部,不能释放小部分,没有判空

(6)在这里插入图片描述
越界标记被改掉,所以函数会越界
(7)
在这里插入图片描述
ip++错误,malloc函数申请的空间为定值,不可随意增删
(8)
在这里插入图片描述
内存泄漏,程序奔溃
改法一:C++引用

#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
void GetString(char*&p, int n)//加一个引用
{
	p = (char*)malloc(sizeof(char) * n);
}
int main()
{
	int n = 100;
	char* cp = NULL;
	GetString(cp, n);

	strcpy(cp, "hello tulun");
	printf("%s", cp);
	printf(cp);
	free(cp);
	return 0;
}

改法二:加一个返回值

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
char* GetString(char*p, int n)//改返回值类型
{
	p = (char*)malloc(sizeof(char) * n);
	return p;//加一个返回值
}
int main()
{
	int n = 100;
	char* cp = NULL;
	cp = GetString(cp, n);//加一个返回值

	strcpy_s(cp, n, "hello tulun");
	printf("%s \n", cp);
	printf(cp);
	free(cp);
	return 0;
}

改法三:二级指针

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
void GetString(char**p, int n)//二级指针
{
	*p = (char*)malloc(sizeof(char) * n);
	
}
int main()
{
	int n = 100;
	char* cp = NULL;
	GetString(&cp, n);//加一个解引用

	strcpy_s(cp, n, "hello tulun");
	printf("%s \n", cp);
	printf(cp);
	free(cp);
	return 0;
}

程序运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值