动态分配内存

动态分配内存

c++中仅仅使用new关键字

1-申请单个变量内存

#include<iostream>
#include<cstring>
#include<cstdio>
#include<assert.h>
using namespace std;


void test_c()//c语言的方法
{
    int *pc=(int *)malloc(sizeof(int));
  assert(pc);//不为空,则执行下面语句
    memset(pc,0,sizeof(int));//初始化内存
    *pc=123;
    printf("%d",*pc)
    free(pc);
    pc=nullptr;
}
void test_cpp()//c++的方法
{
    int*pc=new int;
      assert(pc);//不为空,则执行下面语句
    pc=2233;
    cout<<pc;
    delete pc;
    pc=nullptr;
    //对于字符串,不能使用赋值号
    char *pc_char= new char;
    //*pc="abcdefg";//报错 只能用strcpy
   strcpy(pc_char,"abcdefg");
    
}
int main()
{
    
    
}

2-申请连续空间内存

#include <iostream>
#include <cstring>
#include <cstdio>
#include <assert.h>
using namespace std;

void test_c() //c语言的方法,分配一块内存
{

    int *pc = (int *)malloc(10 * sizeof(int)); //申请一段空间,一维数组
                                               //可以使用calloc,能省去memset() // int *pc=(int *)calloc(10,sizeof(int));
                                               //注意含有两个参数,第一个参数是代表分配多少个int大小的连续内存
    assert(pc);                                //不为空,则执行下面语句
    memset(pc, 0, 10 * sizeof(int));           //初始化内存
    pc[0] = 1122;
    pc[9] = 3232;
    cout << "p[0]为:" << pc[0] << "\t"
         << "p[9]为:" << pc[9] << endl;
    // printf("%p", pc);
    // printf("%c")

    cout << pc << endl; //打印地址

    //对于realloc函数,是扩容函数realloc函数和上面两个有本质的区别,其原型void realloc(void *ptr, size_t new_Size)
    //用于对动态内存进行扩容(及已申请的动态空间不够使用,需要进行空间扩容操作),ptr为指向原来空间基址的指针, new_size为接下来需要扩充容量的大小。

    int *pcPlus = (int *)realloc(pc, 5 * sizeof(int)); //重新分配一块小于之前大小的内存
    cout << "分配一块小于或者等于之前大小空间的内存,地址将保持原状" << endl;
    cout << pcPlus;//打印地址
    // int *pcPlus = (int *)realloc(pc, 10 * sizeof(int));//重新分配一块等于之前大小的内存,地址将保持原状
    // cout << pcPlus;

    // 其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。
    // 如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,
    // 同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。relloc函数分配的空间也是未初始化的。

    // cout << "分配一块大于之前大小空间的内存,地址将改变";
    // int *pcPlus = (int *)realloc(pc, 20 * sizeof(int));

    // cout << "扩容后的大小为         " << sizeof(pcPlus) << endl; //注意我们无法通过sizeof计算出指针指向的空间大小,这是由于动态分配的性质造成的,动态分配是在运行时分配内存的
    // sizeof是一个关键字,一个操作符,不是一个函数,它的计算结果在编译时就已经确定了的,不是在运行时,如果你要在运行时分配一个空间,显然大小在运行时应该也是可知的。
    //  你不能要求sizeof在编译时知道运行时的东西,这是不可能的。
    //除非,该指针指向数组这类,编译时就分配好指定内存,才能使用sizeof计算指针所指向的空间大小。

    // cout << pcPlus;//打印地址
    free(pcPlus);
    pcPlus = nullptr;
}
void test_cpp() //c++的方法申请一块内存 
{
    int *pc = new int[5];
    assert(pc); //不为空,则执行下面语句
    pc[5] = 2233;
    cout << pc;
    delete pc;
    pc = nullptr;

}
int main()
{
    test_c();
    test_cpp();
}
3-申请空间并初始化
#include<iostream>
using namespace std;
#include<cstring>
void test_cpp ()
{
  //  单个数据使用()
  int *Pnum=new int (100);
    cout<<*pnum;
    delete pnum;
    pnum=nullptr;
    //多个数据用{}
    int *PPnum=new int[5]{1,2,3,4,5};
    for(int i=0;i<5;i++)
    {
        cout<<PPnum[i]<<"\t"
    }
    cout<<endl;
    
}
int main()
{
    
}
4——c++y允许我们重新管理申请堆内存
#include <iostream>
using namespace std;
#include <cstring>
void test_cpp()
{
    char *number = new char[100];
    int *point_f = new (number + 0) int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    //前40个字节存放10个整数,从number数组下标为0处开始
    // cout<<point_f<<endl;

    cout <<"number指针所指向处          "<< number + 40 << endl; //结果为空

    cout << "point_f指针所指向处        "<<*(point_f+3) << endl;  //结果为第4个数
    

    char *ptr = new (point_f + 10) char[20];
//从point数组结尾又申请20个字节

    strcpy(ptr, "hello linux");

    cout <<"ptr指针所指向处:    " << ptr << endl;//打印整个字符串
}
int main()
{
    test_cpp();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁金金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值