C++中為什么要使用動(dòng)態(tài)內(nèi)存
為什么要使用動(dòng)態(tài)內(nèi)存
1.按需分配,根據(jù)需要分配內(nèi)存,不浪費(fèi)
int main(void) {
int money[10] = { 1, 2, 3 ,4, 5, 6, 7, 8, 9, 10 }; //工錢
int len = sizeof(money) / sizeof(money[0]); //money數(shù)組的長(zhǎng)度
int num = 20; //人數(shù)
int *salary = 0; //薪資
//給salary指針分配num個(gè)內(nèi)存
salary = new int[num];
//方式一, 逐個(gè)賦值
/*for (int i = 0; i < len; i++) {
*(salary + i) = money[i];
}*/
//方式二, 使用memcpy內(nèi)存拷貝
//memcpy(目標(biāo), 源數(shù)組, 數(shù)組的字節(jié));
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 << "個(gè)員工的薪資是: " << *(salary + i) << endl;
}
system("pause");
return 0;
}

2.被調(diào)用函數(shù)之外需要使用被調(diào)用函數(shù)內(nèi)部的指針對(duì)應(yīng)的地址空間
#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;
//方式一, 返回分配給指針的地址
int* copy1(int count) {
int* ap = NULL;
//malloc是C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配操作符
ap = (int*)malloc(sizeof(int) * count);
//new是C++中的動(dòng)態(tài)內(nèi)存分配操作符
//ap = new int[count];
if (ap == NULL) {
exit(1);
}
for (int i = 0; i < count; i++) {
*(ap + i) = 100 + i;
}
return ap; //返回指針的地址
}
//方式二, 使用二級(jí)指針
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函數(shù)返回指針的地址
//p = copy1(10);
//方式二, 使用二級(jí)指針
copy2(&p, 10);
for (int i = 0; i < 10; i++) {
cout << "第" << i+1 << "個(gè)員工的薪資是: " << *(p+ i) << endl;
}
//c 語(yǔ)言中的釋放內(nèi)存函數(shù),相當(dāng)于 delete
free(p);
system("pause");
return 0;
}
C 內(nèi)存分配: void *malloc(size_t size); // 分配內(nèi)存 void free(void *); // 釋放內(nèi)存 malloc 在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長(zhǎng)度為 size 字節(jié)的連續(xù)區(qū)域返回該區(qū)域的首地址.
3.突破棧區(qū)的限制,可以給程序分配更多的內(nèi)存
#include <iostream>
#include <Windows.h>
using namespace std;
//棧區(qū)的空間大小是有限的, 在Windows系統(tǒng)中一般有 1-2 M的內(nèi)存
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系統(tǒng)的限制是 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;
}

到此這篇關(guān)于C++中為什么要使用動(dòng)態(tài)內(nèi)存的文章就介紹到這了,更多相關(guān)C++動(dòng)態(tài)內(nèi)存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C/C++ 傳遞動(dòng)態(tài)內(nèi)存的深入理解
- C++動(dòng)態(tài)內(nèi)存分配超詳細(xì)講解
- 詳解C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配
- C++ 中繼承與動(dòng)態(tài)內(nèi)存分配的詳解
- 詳解C++動(dòng)態(tài)內(nèi)存管理
- c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)總結(jié)
- c++動(dòng)態(tài)內(nèi)存管理與智能指針的相關(guān)知識(shí)點(diǎn)
- 一文搞懂C++ 動(dòng)態(tài)內(nèi)存
- C++使用動(dòng)態(tài)內(nèi)存分配的原因解說(shuō)
- c++動(dòng)態(tài)內(nèi)存管理詳解(new/delete)
- C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)
相關(guān)文章
Qt串口通信開發(fā)之QSerialPort模塊Qt串口通信接收數(shù)據(jù)不完整的解決方法
這篇文章主要介紹了Qt串口通信開發(fā)之QSerialPort模塊Qt串口通信接收數(shù)據(jù)不完整的解決方法,需要的朋友可以參考下2020-03-03
C語(yǔ)言菜鳥基礎(chǔ)教程之a(chǎn)++與++a
很多同學(xué)在學(xué)習(xí)c語(yǔ)言的時(shí)候是不是會(huì)碰到a++和++a都有甚么作用啊。今天我們就來(lái)探討下2017-10-10
Visual?Studio?2022?配置?PCL?1.12.1?的問(wèn)題小結(jié)
這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗(yàn)總結(jié)分享,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
關(guān)于C語(yǔ)言 const 和 define 區(qū)別
這篇文章主要介紹了關(guān)于C語(yǔ)言 const 和 define 區(qū)別 的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容2021-09-09
C語(yǔ)言實(shí)現(xiàn)循環(huán)單鏈表的示例代碼
這篇文章主要給大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)循環(huán)單鏈表,文章通過(guò)代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-08-08

