C语言----动态内存
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言----动态内存相关的知识,希望对你有一定的参考价值。
- 普通变量创建开辟空间大小是固定的
- 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配(
柔性数组除外,后文会写到
)在内存中如图
所以就有了动态内存
动态内存函数
1)malloc
void* malloc( size_t size );
size是分配未初始化储存的字节大小
开辟成功,则返回这个开辟的空间的指针
。开辟失败,则返回NULL
。- 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
- 如果参数 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是元素类型大小
- 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节全初始化为0
int *p = calloc(10, sizeof(int));
3)realloc
void *realloc( void *ptr, size_t new_size );
ptr为前面malloc、calloc开辟空间的地址
size为新空间的大小(注意,是总大小不是新开辟的空间大小
)
- 返回值为调整之后的内存起始位置。
- 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间
realloc在调整内存空间的场景:
- 原有空间之后没有足够大的空间,
函数会找一块够用的空间,同时把原来的数据copy下来,返回新开辟空间的地址,同时free掉原空间
- 原来的空间后面有足够的空间 紧接着直接开辟新空间
如果无空间可增加 则返回空指针,所以下面的代码是错误的
- 当没有空间时原来malloc开辟的空间的数据也会丢失
- 所以需要中间变量来确定realloc是否为空指针后再赋予p
//错误代码
p=realloc(...) //p为malloc开开辟的空间地址
4)free
void free( void* ptr );
如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数 ptr 是NULL指针,则函数什么事都不做
- free只能free堆区
以上是关于C语言----动态内存的主要内容,如果未能解决你的问题,请参考以下文章