动态内存开辟详解

malloc函数

函数原型 :void* malloc ( size_t size )
1.如果开辟成功,则返回一个指向开辟好空间的指针。
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
3.返回值的类型是 void ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
注:
1.malloc会在内存中开辟一块连续的空间,并返回该空间起始位置处的地址。
2.由于返回的指针类型是void,所以由使用者自己决定指针类型(使用强制类型转换)
3.我们size代表的是将要开辟的字节个数,我们经常使用malloc( n*sizeof(type))这样的方式来开辟空间
4.注意free函数的使用,当开辟好的内存空间不再使用时,我们应该及时将指向这个内存的指针free,并置为空指针NULL。

代码示例

int main()
{
    
    
	int* p = (int*)malloc(10*sizeof(int));  //开辟10个整型大小的内存空间
	if(p == NULL//内存开辟失败,返回空指针
	{
    
    
		printf("开辟内存空间失败\n");  
	}
	for(int i = 0; i<10; i++)
	{
    
    
		*(p+i) = i;      
	}
	free(p);                          //将p释放
	p = NULL;                         //及时将P置为空指针,避免非法访问未知空间
	return 0;
}

calloc

函数原型 :void* calloc ( size_t num, size_t size )*
1.num–代表是要开辟的元素个数, size–代表的是每个元素所占字节大小
2.calloc用法与malloc用法相似,不同点是,calloc会直接把开辟的内存中值初始化为0
注:
1.calloc开辟空间后会直接将空间内容初始化为0
2.使用时,也需要先判断指针是否为NULL

代码实现

int main()
{
    
    
	int* p =(int*) calloc(10,4);
	for(int i=0;i<10;i++)
	{
    
    
		printf("%d\n",*(p+i));        //打印结果将全为0
	}
	free(p);                          //指针及时释放
	p = NULL;
}

realloc

函数原型 :void* realloc ( void* ptr, size_t size )
1.由于一开始开辟的内存空间过大或者过小,需要调整动态内存空间,于是将会使用ralloc来调整空间大小
2.ptr–是要调整的内存地址 size–是调整之后的空间新大小
3.返回值是调整之后的内存起始位置
4.该函数会将原来内存数据拷贝到新开辟内存空间中
注:
realloc在开辟内存时有两种情况

在这里插入图片描述
情况1:在扩展内存时,原内存后有足够大的空间,那么可以直接在原内存空间后追加内存
情况2:原有空间后没有足够大的空间,那么扩展空间的方式是:在堆空间上另找一个合适大小的连续空间来
使用。这样函数返回的是一个新的内存地址。 由于上述的两种情况,realloc函数的使用就要注意一些。 举个例
子:

总结:动态内存开辟是十分重要的内容,可以帮助我们更加灵活的使用内存,用于储存数据,由于大小可变,相对于数组来说,对于内存浪费的现象便没有那么大的影响。
但是,我们要知道在内存开辟时,我们要在使用指针时,判断指针是否指向有限空间,同时在内存使用结束后,我们要及时将指针释放,避免内存泄漏。

猜你喜欢

转载自blog.csdn.net/cdzg_zzk/article/details/115184726