• 二维数组的动态创建和释放


    二维数组的动态创建和释放

    创建二维数组优先分配行指针的内存,这样才能保证二维数组的行地址内存是连续的(这里的内存连续是指每一个行指针地址之差值相同,这个差值就是每个一维数组的长度)。如果是采取一个一个申请一维数组,那无法保证这些一维数组所形成的二维数组行指针内存连续


    第一种方式:使用malloc free

    先看一维数组的

    1.动态开辟一维数组
    
    //动态开辟一维数组
    void dynamicCreate1Array()
    {undefined
    int m;
    int i;
    int *p;
    
    printf("请输入开辟的数组长度:");
    scanf("%d",&m);
    p = (int*)malloc(sizeof(int)*m);//动态开辟
    
    printf("请输入数据:");
    for(i = 0; i < m ; i++)
    	scanf("%d",&p[i]);
    
    printf("输出数据:\n");
    for(i = 0; i < m; i++)
    	printf("%d ",p[i]);
    free(p);
     p=NULL
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    //动态开辟二维数组
    void dynamicCreate2Array()
    {undefined
    int m,n;
    int i,j;
    int **p;
    printf("请输入数组行和列:");
    scanf("%d%d",&m,&n);
    
    p = (int**)malloc(sizeof(int*)*m); //开辟行
    
    for(i = 0; i < m; i++)
    {
    	*(p+i) = (int*)malloc(sizeof(int)*n);//开辟列
    }
    //输入数据
    printf("请输入数:");
    for(i = 0 ; i < m;i++)
    	for(j = 0; j < n;j++)
    		scanf("%d",&p[i][j]);
    
    //输出数据
    for(i = 0 ; i < m;i++)
    {
    	for(j = 0; j < n;j++)
    	{
    	   printf("%3d ",p[i][j]);
    	}
    	printf("\n");
    }
    //释放开辟的二维空间
    for(i = 0; i < m;i++)
    	free(*(p+i));//释放每一行
         free(p);//最后释放二维指针变量
     p=NULL
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    野指针

    前面提到,指针消亡,并不意味着其所指向的内存会被自动释放,同样,释放动态内存,并不意味着指针会消亡,也不意味着指针的值会改变,如下所示:

    //假设p是代码块内声明的局部指针变量,在代码块执行完毕退出时,p自动消亡,但p指向的大小为8、类型为int的内存空间不会释放掉。

    //代码退出后,程序无法再通过指针p释放所申请的动态内存,这块内存已经“泄露——————内存泄漏

    int *p=new int[8];

    //运行以后,指针p非但不会消亡,其值还会保持不变,并不会变为null。此时使用if(指针!=null)进行处理也无法起到防错作用。

    delete [] p;

    解决方法:指针被free或者delete后,一定要置为null,没有置为null的指针常称为”野指针“。


    第二种方式:使用new delete

    先看一维数组的

    cout<<"请输入长度:";
    cin>>len;
    
    int *p = new int[len];
    
    cout<<"请输入数据:";
    for(int i = 0; i < len; i++)
    	cin>>p[i];
    
    cout<<"输出数据:"<<endl;
    for(i = 0; i < len; i++)
    	cout<<setw(4)<<p[i];
    
    delete[] p;
    p=NULL
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    二维数组的

    
    
    int m,n;
    cout<<“请输入行和列:”;
    cin>>m>>n;
    
    //动态开辟空间
    int **p = new int*[m]; //开辟行
    for(int i = 0; i < m; i++)
    	p[i] = new int[n]; //开辟列
    
    cout<<"请输入数据:";
    for(i = 0 ; i < m ; i++)
    	for(int j = 0; j < n; j++)
    		cin>>p[i][j];
    
    cout<<"输出数据:"<<endl;
    for(i = 0; i < m; i++)
    {
    	for(int j = 0; j < n; j++)
    		cout<<setw(3)<<p[i][j];
    	cout<<endl;
    }
    
    //释放开辟的资源
    for(i = 0; i < m; i++)
    	delete[] p[i];
    delete[] p;
    p=NULL
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    指针详解【C语言】
    jetson nano刷机更新Jetpack
    python毕业设计题目推荐在线考试题库系统
    PDE求格林函数
    新方向!文心一言X具身智能,用LLM大模型驱动智能小车
    @AutoWired与@Resource
    固体物理-复习重点
    【socket.js联合express】:搭建简约版聊天室
    【安全测试】渗透测试神器BurpSuite环境搭建
    大数据技术训练舱:Redis的分布式实践(上)从零开始编译、安装、配置Redis6,规范化搭建Java工程测试
  • 原文地址:https://blog.csdn.net/qq_55125921/article/details/126084492