C语言动态内存

本文介绍了C语言中动态内存管理的基本概念和常用函数,包括malloc、calloc、realloc的使用方法及注意事项。讲解了动态内存分配的重要性,以及如何避免内存泄漏。此外,还提到了C99中的柔性数组特性及其优势。
摘要由CSDN通过智能技术生成

动态内存管理

局部变量、函数的形式参数存在于栈区;全局变量、静态变量存在于静态区;动态内存分配存在于堆区。

动态内存分配函数介绍

malloc
 

int* p = (int*)malloc(10* sizeof(int));//向内存中申请10个整形空间,把地址传给p

malloc返回的是void* 强制转换为int*
头文件:#include<stdlib.h>

#include<stdlib.h>
#include<string.h>
#include<errno.h>

int main()
{
	int* p = (int*)malloc(10 * sizeof(int));
	if (p == NULL)//必须进行判断,以防非法空间
	{
		printf("%s\n", strerror(errno));//streeor头文件:string.h    error头文件:errno.h
	}
	else
	{

	}
	free(p);
	p = NULL;//当动态申请的空间不再使用的时候利用free函数释放
	return 0;
}

free函数:只能释放动态开辟的空间。

calloc

类似于malloc,可以区别可以初始化内存为0.

int* p=(int *)calloc (10,sizaof(int));

realloc

malloc申请一个空间后,觉得不够用了,想再增加空间,这时realloc就发挥了作用

void* realloc (void* memblock,sizeof(size);

realloc(p,40);//把p指向的空间,扩大到40个原先类型的空间,返回类型是void*,为调整之后的内存起始位置。
返回void*地址分几种情况:
一、追加的内存够,返回原先内存的首地址。
二、追加的内存空间不够,重新申请空间,并拷贝原先数据释放内存,返回新地址。
三、如果realloc申请内存失败会返回null,这样的话会修改原地址,因此为了防止此现象得用一个新的变量来接受realloc返回值,使用后必须释放空间
四、对非动态开辟的空间不能使用free释放
五、不能对同一块动态的内存的多次释放
六、不能对动态开辟的内存忘记释放(内存泄漏)

柔性数组

c99中结构体的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员

struct s
{
	int n;
	int arr[0];//未知大小的——柔性数组成员——数组大小可以调整
};
//使用
int main()
{
	struct s* ps = (struct s*)malloc(sizeof(struct s)) + 5* sizeof(int);
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	return 0;
}

柔性数组的优势:1、方便内存释放2、有利于访问速度
 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值