C语言动态内存分配

动态分配内存

存储区基本分类

静态存储区:全局变量,静态局部变量(程序进程或线程结束后释放)
动态存储区:
栈:非静态局部变量(出局部变量作用域就被释放)
堆:用户自行决定何时释放,用free进行操作,若不释放,则一直使用至程序结束;

动态分配内存的库函数

在动态分分配内存开始,需要引入如下库函数

#include <stdlib.h>

在 C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
size – 内存块的大小,以字节为单位。
该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

在 C 库函数 void free(void *ptr) 释放之前调用 malloc、calloc 或 realloc所分配的内存空间。
ptr – 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc
进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。
该函数不返回任何值。

一维分配内存实例

#include <stdlib.h>

int main()
{
	int *p = NULL;
	//内存空间分配
	p = malloc(sizeof(int)*4); //申请了4个int型变量大小的空间,申请成功后会将存储空间首地址传递给p,如果不成功,则返回NULL
	/*内存操作开始*/
	for(int i=0;i<4;i++)
	{
		p[i] = i+1; 	//等价于*(p+i) = i+1;
	}
	/*内存操作结束*/
	//内存空间释放
	free(p);	//释放p
	p = NULL;	//防止野指针出现
	return 0;
}

注意:

  1. 指针变量初始话,防止野指针出现;
  2. 分配空间于释放空间一定是一对一的(一对一是指执行流程上,而不是语句上),即使用完动态分配空间后要free指针变量)。

二维动态内存分配实例

#include <stdlib.h>

int main()
{
	int **pp = NULL;
	//内存空间分配
	pp = malloc(sizeof(int*)*4); //申请了4个int*型变量大小的空间,申请成功后会将存储空间首地址传递给p,如果不成功,则返回NULL。这里相当于申请二维数组的列的基地址
	
	/*内存操作开始*/
	for(int i=0;i<4;i++)
	{
		pp[i] =malloc(sizeof(int)*(i+1); 	//等价于*(p+i) = i+1;
	}
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<i+1;j++)
		{
			pp[i][j] = j;	//等价于 *(*(pp+i)+j)=j
			printf(" %d ",pp[i][j]);	
		}
		printf(" \n");	
	}
	/*内存操作结束*/
	
	/*内存空间释放*/
	for(int i=0;i<4;i++)
	{
		free(pp[i]);
	}
	free(pp);	//释放p
	pp = NULL;	//防止野指针出现
	return 0;
}

注意:

  1. 指针变量初始话,防止野指针出现;
  2. 分配空间于释放空间一定是一对一的(一对一是指执行流程上,而不是语句上),即使用完动态分配空间后要free指针变量)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值