c语言动态内存开辟

动态内存开辟

[malloc](malloc - C++ Reference (cplusplus.com))和[free](free - C++ Reference (cplusplus.com))

void* malloc (size_t size);   // 函数原型
void free (void* ptr);
如果开辟成功,则返回void* 类型的指针
如果开辟失败,则返回空指针
free只能释放堆区开辟的空间
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
	// 使用malloc开辟10个整形的空间
	int* p = (int*)malloc(10 * sizeof(int));	// 由于malloc的返回值是void*,所以一般要强转
	// 如果开辟失败
	if (p == NULL)
	{
		perror("erro");
	}
	else {
		// 赋值
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			*(p + i) = i;
		}
		// 打印
		for (i = 0; i < 10; i++)
			printf("%d ", i);
	}
	// 使用完该空间之后要用free函数将该空间释放,free函数需要传递一个指向该空间的指针
	free(p);
	// 接着需要将指针p置为NULL,防止它访问已经释放的空间
	p = NULL;
	return 0;
}

[calloc](calloc - C++ Reference (cplusplus.com))

void* calloc (size_t num, size_t size);
calloc会将开辟的内存的所有字节初始化为0
int main()
{
	int* p = (int*)calloc(10, sizeof(int));	// 开辟十个int类型的空间
	if (p == NULL)
		perror("erro");
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", *(p + i));
	}
	free(p);
	p == NULL;
	return 0;
}  // 运行结果为全0

[realloc](realloc - C++ Reference (cplusplus.com))

realloc请求的大小可以比当前分配的字节数小或者大。如果比当前分配的小,那么多余的内存会返回给堆,不能保证多余的内存会被清空。
如果比当前分配的大,那么可能的话,就在紧挨这当前分配内存的区域分配新的内存(内存足够),否则就会在堆的其它区域分配并把旧的内存复制到新区域
void* realloc (void* ptr, size_t size);
int main()
{
	int* p = (int*)calloc(10, sizeof(int));	// 开辟十个int类型的空间
	if (p == NULL)
		perror("erro");
	for (int i = 0; i < 10; i++)
	{
		*(p + i) = 1;
	}
	// 现在需重新开辟20个int类型的空间,就需要用到realloc
	int* ptmp = realloc(p, 2000*(sizeof(int)));
	if (ptmp != NULL)
		p = ptmp;
	return 0;
	free(p);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值