【C/C++】为什么使用动态分配?

1.按需取用,不浪费

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

//WHY1:按需分配,不浪费内存

int main(){
	int worker[]={20, 22, 25, 19, 18, 23 ,17, 28, 30, 35};
	int *salary = NULL;
	int n = 0;
	printf("请输入雇佣人数:");

	//scanf_s("%d", n);×
	scanf_s("%d", &n);

	if (n >= 1){
		salary = new int [n];

		//一.赋值
		//1.提供数组以内元素赋值
		/*//①挨个赋值
		for (int i=0; i<n; i++){//赋值
		//=salary[i] = worker[i];
		//=*(salary+i) = worker[i];
		*(salary+i) = *(worker+i);
		}
		*/
		//②memcpy函数赋值-一次性内存拷贝
		memcpy(salary, worker, sizeof(worker));

		//2.提供数组以外元素赋值
		if (n > sizeof(worker)/sizeof(int)){
			for (int i=sizeof(worker)/sizeof(int); i<n; i++){
				*(salary+i)=18;//后招的工人都是18岁
			}
		}
		
		//二.打印
			for (int i=0; i<n; i++){
				printf("雇佣的第%d位工人的年龄为:%d\n", i+1, *(salary+i));
			}
		delete [] salary;
	}else if (n <= 0){
		printf("输入人数错误!\n");
	}

	system("pause");
	return 0;
}

2.局部变量全局化(延长函数内赋值变量的生存周期)

#include <stdio.h>
#include <stdlib.h>
//局部变量全局化:栈区内(函数内局部变量)通过存储在堆区(动态内存所在),且由指针分配初始指向地址,实现全局调用

//①返回指针
int* demo1(int n) {
	int* ap = NULL;
	ap = (int*)malloc(n * sizeof(int));//因ap为int型,malloc参数为所需动态内存字节数;malloc默认为void *,记得强制类型转换为ap类型
	for (int i = 0; i < n; i++) {//赋值
		*(ap + i) = i;
	}
	return ap;
}

//②二级指针
void demo2(int** pointer, int n) {
	int* ap = NULL;
	ap = (int*)malloc(n * sizeof(int));//先分配内存
	*pointer = ap;//再赋地址
	for (int i = 0; i < n; i++) {//赋具体值
		*(ap + i) = i;
	}
}
int main3() {
	int* pointer;
	int n = 10;
	/*//-------①-------
	pointer = demo1(n);
	for (int i=0; i<n; i++){
		printf("*(pointer+%d)=%d\n", i, *(pointer+i));
	}
	printf("-------------------------\n");
	*/
	//-------②-------
	demo2(&pointer, n);
	for (int i = 0; i < n; i++) {
		printf("*(pointer + %d)=%d\n", i, *(pointer + i));
	}

	//delete pointer;√-在malloc下随意
	//delete [] pointer;√-在malloc下随意
	free(pointer);

	system("pause");
	return 0;
}

//C中malloc,free与C++中new delete相同(C++更简便,且可实现更多功能,面向对象不能用malloc和free)

3. 函数内部利用堆区大内存

#include <stdio.h>
#include <stdlib.h>
//转移大阵地-利用堆区大内存,突破栈区限制

//因为是栈区,故要在函数中
void demo() {
	//栈区内存:1M-2M(windows)
	//int a[102400];//100k*4=400k
	//int a[102400*3];×-stack overflow.因100k*4*3=1200k=1.2M
	int* ap;

	//堆区内存:2G(64位win10)
	ap = (int*)malloc(1024 * 1024 * 1024 * 100);//??100G??为啥100G还能正常打印,不该是>2G就一定溢出了吗(可能在1.8G时就已溢出,因其他程序占用内存)
	printf("demo\n");
}

int main4() {
	printf("----start----\n");
	demo();
	printf("----end----\n");
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值