前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言】calloc()函数详解(动态内存开辟函数)

【C语言】calloc()函数详解(动态内存开辟函数)

作者头像
修修修也
发布2024-04-01 15:51:06
1170
发布2024-04-01 15:51:06
举报

一.calloc()函数简介

我们先来看一下cplusplus.com - The C++ Resources Network网站上calloc()函数的基本信息:

1.函数功能

可以看到,calloc()函数的功能是:为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0.

2.函数参数

该函数一共有2个参数,分别是:

代码语言:javascript
复制
void* calloc (size_t num, size_t size);
1>.size_t num

第一个参数的类型无符号整型(size_t),它表示需要动态开辟的元素的个数.

2>.size_t size

第二个参数的类型无符号整型(size_t),它表示需要开辟的每个元素的大小(以字节为单位).

在使用calloc时,一般参数传递的形式为(要开辟的个数 , sizeof(要开辟的变量名)). 当然也可以直接给calloc传一个具体的数字作为参数,比如:calloc(10 , 4);这样calloc()函数就会开辟一个大小为40字节的空间给你使用.


3.函数返回值

代码语言:javascript
复制
void*

函数的返回值类型void*(无类型指针),它的作用是在函数运行结束后返回给主函数动态开辟好并初始化了的空间块的首地址,以便后续进行对这块内存空间的使用.

但要注意:如果在calloc()函数在开辟的过程中遇到了无法分配请求的内存块(即遇到了开辟失败的情况),那么就会返回一个NULL指针,对NULL指针的解引用操作是不被允许的,因此calloc的返回值一定要进行检查!

4.函数头文件

该函数包含在头文件<stdlib.h>中.

5.函数生成空间(与malloc区别)

malloc()函数生成的空间内容是不会初始化的!

我们可以调试一下,打开监视窗口查看malloc()函数开辟的内存空间存放的内容:

不会调试使用监控查看程序运行状况的可以移步: 【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序https://blog.csdn.net/weixin_72357342/article/details/133823086?spm=1001.2014.3001.5502

可以看到,malloc()函数开辟的内存空间中存放的值是随机值,我们后续需要初始化后再进行使用.

calloc则会开辟一段已经全部初始化为0的空间:

想要了解更多关于malloc()函数的内容可以移步: 【C语言】malloc()函数详解(动态内存开辟函数)

icon-default.png?t=N7T8
icon-default.png?t=N7T8

https://blog.csdn.net/weixin_72357342/article/details/133971625?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133971625%22%2C%22source%22%3A%22weixin_72357342%22%7D

我们在这篇就不多赘述了,只简述他们俩在开辟空间方面的区别.


二.calloc()函数的具体使用

calloc()函数的使用场景是:当我们想要使用一块连续的可以按需求调节大小的并且是初始化好的空间时,我们可以使用calloc()函数来实现这一诉求.

需要特别注意的是!使用calloc()函数动态开辟的内存空间是必须使用free()函数释放还给操作系统的,如果不释放的话就会造成内存泄漏! 内存泄漏:如果动态开辟的内存没有被释放,那么这些内存就会一直占用系统资源,从而导致内存泄漏。内存泄漏会导致程序运行速度变慢,甚至崩溃。 对free()函数还不太了解的可以移步这里: 【C语言】free()函数详解(动态内存释放函数)

icon-default.png?t=N7T8
icon-default.png?t=N7T8

https://blog.csdn.net/weixin_72357342/article/details/133975657?spm=1001.2014.3001.5502

1.使用calloc()函数完成动态整型数组空间的开辟

如下,我们使用malloc()函数开辟一个有10个元素的整型数组:

分别给calloc()函数传入:数组元素个数(即10),数组元素类型占空间字节数(即sizeof(int)).

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

int main()
{
	int* p = (int*)calloc(10,sizeof(int));   //动态开辟内存空间

	if (p != NULL)                          //检验动态开辟空间是否成功
	{
		int i = 0;
		for (i = 0; i < 10; i++)            //如果成功,打印这10个整型
		{
			printf("%d ", *(p + i));
		}
	}
	else
	{
		printf("%s\n", strerror(errno));   //如果失败,则打印失败错误信息
		return 0;                          //失败则不需要进行下面的释放和置空操作了,可以直接退出
	}

	free(p);         //使用完后向系统归还动态开辟的内存空间
	p = NULL;              //将p指针置为空,避免p成为野指针

	return 0;
}

在vs编译器中运行查看结果:

可见calloc()函数成功的开辟出了40个字节的空间来存放这10个整型数据元素.

而如果我们将动态内存开辟的空间大小改为INT_MAX(即2147483647),动态内存开辟就会失败,并告诉我们原因:

这里还有需要注意的点是,用calloc()函数申请0个空间是一种未定义的行为,不同的编译器会有不同的解决方法,但这样的操作的没有实际意义的.


2.使用calloc()函数完成动态结构体的开辟

创建好结构体变量后,我们给calloc()函数传入:3 , sizeof(PeoInfo)(即3个PeoInfo类型大小的字节数).

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

//人的信息-结构体
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[20];
	char tele[11];//电话11位,留一位给'\0';
}PeoInfo;

typedef struct Contact
{
	PeoInfo* data;  //存放人的信息
	int sz;         //用来记录当前已经存放的信息的个数
	int capacity;   //记录当前通讯录的最大容量
}Contact;

int main()
{
	Contact con;
	PeoInfo* ptr = (PeoInfo*)calloc(3,sizeof(PeoInfo));   //动态开辟空间

	if (ptr == NULL)            //如果开辟失败,则打印错误原因
	{
		perror("InitContact::calloc");
		return;
	}

	free(ptr);         //使用完后向系统归还动态开辟的内存空间
	ptr = NULL;              //将p指针置为空,避免p成为野指针

	return 0;
}

在vs编译器中查看结果:

可见calloc()函数成功的开辟出了3个PeoInfo类型的空间来存放这3个元素,并且将它们全部初始化为了0.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.calloc()函数简介
    • 1.函数功能
      • 2.函数参数
        • 1>.size_t num
        • 2>.size_t size
      • 3.函数返回值
        • 4.函数头文件
          • 5.函数生成空间(与malloc区别)
          • 二.calloc()函数的具体使用
            • 1.使用calloc()函数完成动态整型数组空间的开辟
              • 2.使用calloc()函数完成动态结构体的开辟
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档