C语言----动态内存

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言----动态内存相关的知识,希望对你有一定的参考价值。


  1. 普通变量创建开辟空间大小是固定的
  2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配(柔性数组除外,后文会写到

在内存中如图 所以就有了动态内存在这里插入图片描述

动态内存函数

1)malloc

void* malloc( size_t size );
size是分配未初始化储存的字节大小

  1. 开辟成功,则返回这个开辟的空间的指针
  2. 开辟失败,则返回NULL
  3. 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
  4. 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器
	int* ptr = NULL;
	ptr = (int*)malloc(num*sizeof(int));//注意malloc的强转类型
	if(NULL != ptr)//判断ptr指针是否为空
	{
		int i = 0;
		for(i=0; i<num; i++)
		{
			*(ptr+i) = 0}
	}
	free(ptr);//释放ptr所指向的动态内存
	ptr = NULL;//避免野指针

2)calloc

void* calloc( size_t num, size_t size );
num是数组元素个数 size是元素类型大小

  1. 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
  2. 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节全初始化为0
	int *p = calloc(10, sizeof(int));

3)realloc

void *realloc( void *ptr, size_t new_size );
ptr为前面malloc、calloc开辟空间的地址
size为新空间的大小(注意,是总大小不是新开辟的空间大小

  1. 返回值为调整之后的内存起始位置。
  2. 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间

realloc在调整内存空间的场景:

  1. 原有空间之后没有足够大的空间,函数会找一块够用的空间,同时把原来的数据copy下来,返回新开辟空间的地址,同时free掉原空间
  2. 原来的空间后面有足够的空间 紧接着直接开辟新空间
  3. 如果无空间可增加 则返回空指针,所以下面的代码是错误的
  4. 当没有空间时原来malloc开辟的空间的数据也会丢失
  5. 所以需要中间变量来确定realloc是否为空指针后再赋予p
//错误代码
p=realloc(...) //p为malloc开开辟的空间地址

4)free

void free( void* ptr );

  1. 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  2. 如果参数 ptr 是NULL指针,则函数什么事都不做
  3. free只能free堆区

以上是关于C语言----动态内存的主要内容,如果未能解决你的问题,请参考以下文章

C语言 动态内存分配机制(堆区) int*p=malloc(5*sizeof)

c语言中啥是动态分配内存?

C 中的共享内存代码片段

Redis源代码分析之sds, 动态数组

C语言中的动态内存分配的用法举例

C语言动态内存分配