专栏首页村雨遥malloc,free,calloc,realloc函数

malloc,free,calloc,realloc函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/github_39655029/article/details/79485488

malloc函数

  • 原型:extern void* malloc(unsigned int size);
  • 功能:动态分配内存;
  • 注意:size仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故编程时需要通过以下方式给出:“长度 * sizeof(数据类型)”;
  • 示例:
//动态分配内存,输入5个数据,并把低于60的值打印出来

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *ptr = (int *)malloc(5 * sizeof(int));//分配内存

    for (int i = 0; i < 5; i++)
        {
            scanf_s("%d", &ptr[i]);//输入数据
        }

    int min = 60;
    
    for (int i = 0; i < 5; i++)
    {
        if (min > *(ptr + i))
            printf("%5d", *(ptr + i));//打印出低于60的值
    }
    free(ptr);
    system("pause");
    return 0;
}

free函数

  • 原型:void free(void * ptr);
  • 功能:搭配malloc()函数,释放malloc函数申请的动态内存;
  • 注意:对于free(ptr),若ptr为NULL,则可进行多次释放,若ptr是非空指针,则free对ptr只能进行一次操作,否则程序将崩溃;
  • 示例:见malloc函数;
  • 结果:见malloc函数;

realloc函数

  • 原型: void* realloc(void * ptr,unsigned int size);
  • 功能:先判断当前指针是否有足够的连续空间,若足够,扩大ptr指向的地址并返回,若不够,怎按size指定的大小分配空间,将原数据copy到新分配的内存中,然后释放原ptr所指向区域;
  • 注意:内存使用完毕后,应使用free()函数释放,但原来的指针是自动释放,不需要使用free;
  • 示例:
#include <stdio.h>
#include <stdlib.h>

int main()
{
   char *str;

	/* 一开始的内存分配 */
	str = (char *)malloc(15);
	strcpy(str, "Hello World!");
	printf("String = %s\n", str);

	/* 重新分配内存 */
	str = (char *)realloc(str, 25);
	strcat(str, ", C");
	printf("String = %s\n", str);

	free(str);
	system("pause");
	return 0;
}

calloc函数

  • 原型:void* calloc(unsigned int num,unsigned int size);
  • 功能:为已经分配的内存重新分配空间并复制内容;
  • 注意:num:对象个数,size:对象占据的内存字节数,相较于malloc函数,calloc函数会自动将内存初始化为0;
  • 示例:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num;
	int i;
	int *ptr;

	printf("元素个数为:");
	scanf("%d", &num);

	ptr = (int*)calloc(num, sizeof(int));
	printf("输入 %d 个数字:\n", num);
	for (i = 0; i < num; i++)
	{
		scanf("%d", &ptr[i]);
	}

	printf("输入的数字为:");
	for (i = 0; i < num; i++) {
		printf("%d ", ptr[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 版 C 语言经典 100 例(16 - 20

    村雨遥
  • Java 版 C 语言经典 100 例(21 - 25)

    图形可拆分为两部分来看待,前四行一个规律,后三行一个规律,利用双重 for 循环,第一层控制行,第二层控制列

    村雨遥
  • Java 版 C 语言经典 100 例(26 - 30)

    假设第 5 个人为 岁,则第 4 个人为 岁,第 3 个人为 岁,以此类推,第一个人应该是 岁,而第一个人为 10 岁,所以

    村雨遥
  • 操作系统-位示图实验

    逐梦的青春
  • Uva_10253 Series-Parallel Networks

        2:G1,G2为串并联网络, 将它们的源点与汇点分别连接起来, 得到的也是串并联网络(并联)

    若羽
  • 周练1

    操作I i j:翻转i到j之间的01比特(0变成1,1变成0) 操作Q i:询问第i位比特是什么 //线段树

    饶文津
  • 大数据分析激活电力价值,八大案例深度解析电力大数据应用

    电力大数据的有效应用可以面向行业内外提供大量的高附加值的增值服务业务,对于电力企业盈利与控制水平的提升有很高的价值。有电网专家分析称,每当数据利用率调高10%,...

    腾讯云商业智能分析团队
  • hdu1098

    @坤的
  • C++ 内联函数 inline的详细分析

    这一系列的操作无疑增加了延迟,inline函数就是把函数内容嵌入到函数调用的地方,但仍然保持函数的独立性(即函数有自己的空间)。

    猫叔Rex
  • 运算符重载(看完这篇彻底掌握重载问题)

    运算符重载:用同一个运算符完成不同的运算功能。 C++运算符重载的相关规定如下:

    海盗船长

扫码关注云+社区

领取腾讯云代金券