C语言动态内存函数malloc,calloc,realloc,free详解

发布于:2023-01-11 ⋅ 阅读:(392) ⋅ 点赞:(0)

目录

用法

1、malloc:void *malloc( size_t size );

 2、calloc:void *calloc( size_t num, size_t size );

 3、realloc:void *realloc( void *memblock, size_t size );

4、free:void free( void *memblock );


 

用法

1、malloc:void *malloc( size_t size );

(1)、向内存申请一块连续可用的空间,申请成功返回申请空间的起始地址,申请失败返回空指针;  

(2)、malloc函数的返回值是void*类型的,开辟空间的类型由使用者自己决定;

//开辟四十个字节的空间
	int* p = (int*)malloc(10 * sizeof(int));
	if (p==NULL)
	{
		return 0;
	}

 

(3)、malloc函数申请的空间在没有使用前,空间里面存放的是随机值。

 2、calloc:void *calloc( size_t num, size_t size );

(1)、calloc的参数和malloc不同,calloc为num个元素开辟空间,每个元素的大小为size;

//开辟十个元素大小的空间,每个元素占用四个字节
	int* p = (int*)calloc(10, sizeof(int));
	if (p == NULL)
		return 0;

(2)、在使用前会将每个字节都初始化为0。

 3、realloc:void *realloc( void *memblock, size_t size );

(1)、memblock是 (指malloc或者calloc开辟空间返回的起始地址) p; 

(2)、realloc可以调整开辟内存空间的大小,realloc调整过后返回的起始地址有三种情况。

数据在内存中是一块一块存放的(如下图),如果开辟的空间后面有足够大的空间来进行realloc(第一种情况),那么返回的地址就是原来malloc开辟的p。如果没有足够大的空间,那么realloc函数就会在内存中重新找一块儿足够大的空间,将先前开辟空间里面的内容一起复制到后开辟的空间中,然后销毁掉最初malloc的空间(第二种情况)。    

 

 (3)、realloc返回的起始地址我们依然应该用一个新的指针去接收它,当直接用malloc 开辟出来空间的p接收,如果开辟失败的话返回的是空指针,p==NULL,此时我们原来malloc开辟的空间就也找不到了。因此realloc开辟的空间我们不能直接使用p来接收

代码:可以只看调整部分(整体代码有助于理解)

int main()
{	
	//开辟四十个字节的空间
	int* p = (int*)malloc(10 * sizeof(int));
	if (p==NULL)
	{
		return 0;
	}
	//使用开辟的空间
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
		printf("%d ", *(p + i));
		
	}
	//调整开辟的空间大小################################################
	int* ptr = (int*)realloc(p,15 * sizeof(int));
	if (ptr == NULL)
		return 0;
	p = ptr;
	for (i = 10; i < 15; i++)
	{
		*(p + i) = i;
		printf("%d ", *(p + i));
	}

    //#################################################################


	//释放空间
	free(p);
	p = NULL;

	return 0;
}

4、free:void free( void *memblock );

(1)、free是用来释放动态内存开辟的空间,当使用完了之后我们应将这块空间还给操作系统。只需要返回开辟空间的起始地址即可。

//释放空间
	free(p);
	p = NULL;

(2)、虽然我们将空间还给了操作系统,不过p指针的指向位置却没有改变,但是p指向的空间已经属于操作系统了。如果有人对p进行操作那就会形成非法访问。也就是说此时的p是一个野指针。

所以为了避免非法访问我们将p置为空指针。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到