为什么要使用动态内存

#include <iostream>
#include <string>
#include <Windows.h>
#include <time.h>
#include <cstdlib>

using namespace std;

int * test(int count);
void test_1(int count, int ** point);
void test_2();

int main(void)
{

    //优点1:按需分配  节约内存空间
    int sa[5] = {10,15,41,12,41};
    int *p1 = new int [sizeof(sa)/sizeof(sa[0])];
    memcpy(p1, sa, sizeof(sa));           //这个是把  sa数组里的元素复制到  p1里面来
    for (auto i = p1; i < p1+5 ;i++)
    cout <<  *i <<endl;
    delete [] p1;

    //优点2:堆区是不同程序员间提供接口的  一种存储方式   就是把函数内的指针返回到函数外用
    srand((unsigned)time(nullptr));
    int *temp = test(5);            //这里是转接这块内存的使用权限
    for (int i = 0; i < 5 ; i++)
        cout << *(temp + i) << endl;
    delete [] temp;  //释放数组

    //用二级指针带出函数里面被 初始化的  堆内存
    int *temp_1 = nullptr;    
    test_1(5, &temp_1);        //细节: 函数不用设返回值
    for (int i = 0; i < 5; i++)
        cout << *(temp_1 + i) << endl;
    delete[] temp_1;  //释放数组

    
    //优点3:堆区要比栈区的空间要大的多 
     
    printf_s("开始 \n");
    test_2();
    printf_s("结束 \n");
    system("pause");
    return 0;
}

//优点2:堆区是不同程序员间提供接口的  一种存储方式   就是把函数内的指针返回到函数外用
int * test(int count)
{
    int *p2 = nullptr;   //这个变量名是一个栈变量   函数结束时  就会消失
    p2 = new int[count];   //函数结束  这个内存还是存在的 
    for (int i = 0; i < count; i++)
        *(p2+i) = rand() % 100;
    for (int i = 0; i < count; i++)
        cout << *(p2 + i) << " ";
    cout << endl;
    return p2;
}

//二级指针的带出函数里被初始化的内存
void test_1(int count, int** point)
{   
    //这个  a 变量名是  栈空间的函数结束时释放  所以函数结束时 堆空间的所有权时还给 *point  但是指向的内存是堆空间的
    int * a = nullptr;   
    *point = new int [count];
    a = *point;
    for(int i = 0;i < count;i++)
        *(a+i) = rand()%10;
    for (int i = 0;i < count;i++)
        cout << *(a + i) << endl;
    return ;
}

void test_2()
{
    //int a[102400*2]; //100k*3*4个字节1.2M  //栈空间大约只有1M左右 
    int *a = new int [1024*1000*250];   //堆空间大约有1G左右
    a[0] = 0;
    cout << "this is a demo." << endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值