为什么要使用动态内存
1.按需分配,根据需要分配内存,不浪费
int main(void) {
int money[10] = { 1, 2, 3 ,4, 5, 6, 7, 8, 9, 10 }; //工钱
int len = sizeof(money) / sizeof(money[0]); //money数组的长度
int num = 20; //人数
int *salary = 0; //薪资
//给salary指针分配num个内存
salary = new int[num];
//方式一, 逐个赋值
//方式二, 使用memcpy内存拷贝
//memcpy(目标, 源数组, 数组的字节);
memcpy(salary, money, sizeof(money));
for (int i = len; i < num; i++) {
*(salary + i) = 666; //后面的元素全部赋值为666
}
for (int i = 0; i < num; i++) {
cout << "第" << i+1 << "个员工的薪资是: " << *(salary + i) << endl;
}
system("pause");
return 0;
}
2.被调用函数之外需要使用被调用函数内部的指针对应的地址空间
#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;
//方式一, 返回分配给指针的地址
int* copy1(int count) {
int* ap = NULL;
//malloc是C语言中的动态内存分配操作符
ap = (int*)malloc(sizeof(int) * count);
//new是C++中的动态内存分配操作符
//ap = new int[count];
if (ap == NULL) {
exit(1);
}
for (int i = 0; i < count; i++) {
*(ap + i) = 100 + i;
}
return ap; //返回指针的地址
}
//方式二, 使用二级指针
void copy2(int** ap, int len) {
*ap = (int*)malloc(sizeof(int) * len);
if (*ap == NULL) {
exit(1);
}
for (int i = 0; i < len; i++) {
*(*ap + i) = 100 + 1;
}
}
int main(void) {
int* p = NULL;
//方式一, 接收copy1函数返回指针的地址
//p = copy1(10);
//方式二, 使用二级指针
copy2(&p, 10);
for (int i = 0; i < 10; i++) {
cout << "第" << i+1 << "个员工的薪资是: " << *(p+ i) << endl;
}
//c 语言中的释放内存函数,相当于 delete
free(p);
system("pause");
return 0;
}
C 内存分配:
void *malloc(size_t size); // 分配内存
void free(void *); // 释放内存
malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域的首地址.
3.突破栈区的限制,可以给程序分配更多的内存
#include <iostream>
#include <Windows.h>
using namespace std;
//栈区的空间大小是有限的, 在Windows系统中一般有 1-2 M的内存
void demo1() {
int a1[102400 * 2]; //100k * 2 * 4 = 800k
//int a1[102400 * 3]; //100k * 3 * 4 = 1200k
a1[0] = 1;
cout << "This is a demo!" << endl;
}
//堆空间的大小是有限的, 在Windows10系统的限制是 2G
void demo2() {
int* p = NULL;
p = (int*)malloc(1024 * 1000 * 1000 * 2); //大约2G
p[0] = 1;
cout << "This is a stack demo!" << endl;
}
int main(void) {
//栈空间
//demo1();
//堆空间
demo2();
system("pause");
return 0;
}
到此这篇关于C++中为什么要使用动态内存的文章就介绍到这了,更多相关C++动态内存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!