zoukankan      html  css  js  c++  java
  • C Program进阶-二维数组动态内存开辟

    对于二维数组,我们知道可以用Type ArrayName[Row][Colume]的方式来定义,这是一种静态内存开辟的方式,程序在编译的时候就为该数组分配了空间,而且行和列大小也是指定的。这篇文章里我们来看看二维数组动态内存开辟,开辟空间的大小是运行时才知道,这样可以更实现功能是可以更灵活。

    首先我们来看看如何在内存上分配以实现二维数组的存储。

    假如我们要实现一个3行4列,元素是int类型的二维数组,为了能像静态分配方式一样,使用两个下标i,j分别对应行列的方式访问二维数组,我们要如下分配空间:

    对于这样一个内存布局,当我们要访问第i行第j列的元素,我们就可以像静态分配方式一样,利用p_array2d[i][j];

    下面我们就针对这种方式来实现:

    (1)初始化:

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 #include <assert.h>
     4 #define ROW 3
     5 #define COLUME 4
     6 
     7 void main()
     8 {
     9     int **p_array2d = NULL;
    10     p_array2d = (int **)malloc(sizeof(int *) * ROW);//分配的空间是行数,每一个空间对应指向行空间的第一个元素
    11     assert(p_array2d != NULL);
    12     for (int i = 0; i < ROW; i++)
    13     {
    14         p_array2d[i] = (int *)malloc(sizeof(int) * COLUME);//为每一行分配空间,元素个数是列值
    15         assert(p_array2d[i] != NULL);
    16     }
    17 }

    (2)遍历赋值:

    1     for (int i = 0; i < ROW; i++)
    2     {
    3         for (int j = 0; j < COLUME; j++)
    4         {
    5             p_array2d[i][j] = i + j; //可以像静态分配的方式访问,使用p_array2d[i][j]
    6         }
    7     }

    (3)遍历打印:

    1     for (int i = 0; i < ROW; i++)
    2     {
    3         for (int j = 0; j < COLUME; j++)
    4         {
    5             printf("%d ", p_array2d[i][j]);
    6         }
    7         printf("
    ");
    8     }

    (4)释放空间:

    1     for (int i = 0; i < ROW; i++)//先释放为每一行元素开辟的空间
    2     {
    3         free(p_array2d[i]);
    4         p_array2d[i] = NULL;
    5     }
    6     free(p_array2d);//释放为保存行首元素地址开辟的空间
    7     p_array2d = NULL;

    最后我们将程序的功能模块化,不同的功能封装到函数中:

    #include <stdio.h>
    #include <malloc.h>
    #include <assert.h>
    
    #define ROW 3
    #define COLUME 4
    typedef int Type;
    
    Type **_InitArray2d(int row, int colume)
    {
        Type **p_array2d = NULL;
        p_array2d = (Type **)malloc(sizeof(Type *) * row);
        assert(p_array2d != NULL);
        for (int i = 0; i < row; i++)
        {
            p_array2d[i] = (Type *)malloc(sizeof(Type) * colume);
            assert(p_array2d[i] != NULL);
        }
    
        return p_array2d;
    }
    
    void _AssignArray2d(Type **p_array2d, int row, int colume)
    {
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < colume; j++)
            {
                p_array2d[i][j] = i + j;
            }
        }
    }
    
    void _PrintArray2d(Type **p_array2d, int row, int colume)
    {
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < colume; j++)
            {
                printf("%d ", p_array2d[i][j]);
            }
            printf("
    ");
        }
    }
    
    void _DestroyArray2d(Type **p_array2d, int row)
    {
        for (int i = 0; i < row; i++)
        {
            free(p_array2d[i]);
            p_array2d[i] = NULL;
        }
    free(p_array2d); p_array2d = NULL; } void main() { Type **p_array2d = NULL; p_array2d = _InitArray2d(ROW, COLUME); _AssignArray2d(p_array2d, ROW, COLUME); _PrintArray2d(p_array2d, ROW, COLUME); _DestroyArray2d(p_array2d, ROW); }
  • 相关阅读:
    Microsoft Dynamics CRM 常用JS语法(已转成vs2017语法提示)
    IIS7如何实现访问HTTP跳转到HTTPS访问
    C#调用PB写的com组件dll
    C# winform程序免安装.net framework在XP/win7/win10环境运行!
    文件上传漏洞
    OWASP TOP 10
    sql
    ASCII码查看
    sql注入--mysql
    sql注入--access
  • 原文地址:https://www.cnblogs.com/z-joshua/p/6897615.html
Copyright © 2011-2022 走看看