分配动态内存的函数new与malloc

1.new

1)分配一个整型变量的动态内存
有两种方式

#include<stdio.h>
#inlcude<stdlib.h>
	
int main(void) {
	int num = 0;
	int *salary = NULL;

	//salary = new int(666);//第一种 直接赋值,这次赋的值为668
	
	salary =  new int;//第二种 先分配,
	*salary = 666;//再赋值
	printf("salary:%d\n", *salary);

	delete salary;//释放

	system("pause");
	return 0;
}

2)分配多个整型变量的动态内存

#include<stdio.h>
#inlcude<stdlib.h>
	
int main(void) {
	int num = 0;
	int *salary = NULL;

	printf("请输入需要雇佣的农民的数量:");
	scanf_s("%d", &num);

	if(num <= 0) {//防御性编程
		while(1) {
			printf("输入错误,请重新输入:");
			scanf_s("%d", &num);
			if(num > 0) {
				break;
			}
		}
	}

	salary = new int[num];//分配多个整型变量的动态内存
	for(int i=0; i<num; i++) {
		*(salary + i) = i + 1;
	}

	for(int i=0; i<num; i++) {
		printf("第%d个农民的薪资:%d\n", i+1, salary[i]);
	}
	printf("------over-------\n");
	delete[] salary;
	/*
	如果不进行delete,那么这些动态内存,会一直存放在堆区,存放过多,
	空间就会不够,程序就会挂掉,这是内存泄漏。
	不进行delete,这些动态内存直到main函数的结尾(也就是return 0)之后才会释放掉
	*/

	//delete之后的内存, 禁止访问
	for(int i=0; i<num; i++) {//打印的值为随机值
		printf("第%d个农民的薪资:%d\n", i+1, salary[i]);
	}

	system("pause");
	return 0;
}

动态内存存储在内存中的堆区,随用随取,用完就是释放掉。

用完一定要释放掉,不然会发生内存泄漏:
如果不进行delete,那么这些动态内存,会一直存放在堆区,存放过多,空间就会不够,程序就会挂掉,这是内存泄漏。
不进行delete,这些动态内存直到main函数的结尾(也就是return 0)之后才会释放掉

2.malloc
在c语言中进行分配动态内存的函数,c++也兼容
void *malloc(size_t size);
void free(void *);
malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域的首地址

#include<stdio.h>
#include<stdlib.h>

int *demo(int count) {
	int *ap = NULL;

	//分配以ap为起始地址的count个int类型的动态内存
	ap = (int *)malloc(sizeof(int) * count);//c语言中分配动态内存的函数malloc

	for(int i=0; i<count; i++) {
		*(ap+i) = 100 + i;
	}

	return ap;
}
int *pointer = NULL;
	int count = 0;

	scanf_s("%d", &count);

	//通过函数返回一个动态内存起始地址
	pointer = demo(count);
	
	for(int i=0; i<count; i++) {
		printf("*(pointer+%d) = %d\n", i, *(pointer+i));
	}

	//用完之后,释放动态内存
	free(pointer);//c语言中释放内存的函数

	system("pause");
	return 0;
}

注意:推荐使用new,delete,因为这不是函数,是运算符,执行效率更高。而malloc,free本身是函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值