1. 程式人生 > >指標和malloc構建一個可變二維陣列

指標和malloc構建一個可變二維陣列

以前我一直覺得要指標幹啥呢,要訪問一塊記憶體直接宣告一個變數去訪問不就完了。直到當我想實現一個可變二維陣列才發現沒法用直接宣告的方式去實現。因為我不知道陣列會有幾行,每行有多少個元素。所以這個時候只能先宣告一個二維指標,然後當知道了可變陣列有幾行,每行有幾個元素之後,在用malloc或者free分配相應的記憶體。

下面的程式碼實現功能為:

輸入:2     2

    3    1   5      4

    5     1     2      8      9     3

    0     1

    1     3

輸出:5

    9

解讀:讀入第一行第一個資料為二維陣列的行數,第二資料為要查詢的資料個數。

            讀入第二行第一個資料為這行有多少個元素,後面的資料這是這行的元素

    讀入第三行同第二行一個個道理

            讀入第四行第一個資料表示要讀取資料的行數,第二個數表示要讀取資料的列數

    讀入第五行同第四行一個道理

#include <cstdio>
#include <iostream>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    int n,q,h,g,i,j;
    cin>>n>>q;
    int *a[n];
    int num[n];
    for(h=0;h<n;h++)
    {
        cin>>num[h];
        a[h]=(int*)malloc(sizeof(int)*num[h]);
        for(g=0;g<num[h];g++)
        {
            cin>>a[h][g];
        }
        
    }
    for(h=0;h<q;h++)
    {
        cin>>i>>j;
        cout<<a[i][j]<<endl;
    }
    return 0;
        這裡讀取到二維陣列的行數n後建立了一個有n個元素的指標陣列(跟二維指標是類似的)。在瞭解每行有x個元素後,用malloc建立x*int大小的記憶體,記憶體的頭部地址存入指標函式內。這樣要訪問記憶體中的元素時就可以用陣列的方式進行訪問了----a[ ][ ].。當然這是一個小練習就沒有把malloc分配的記憶體用完後用free釋放掉,在工作中的程式設計分配的記憶體一定要記得釋放掉,防止發生記憶體洩漏的情況。

這個小練習讓我加深理解了指標和malloc的用法。還記得以前看書上記憶體管理的部分時 ,得知宣告定義一個變數同樣是分配記憶體,當時就特別不理解為啥要多此一舉搞一個malloc函式也來分配函式。做完上面的小練習就知道了動態分配記憶體還得靠malloc,而且用指標和malloc來分配記憶體可以使用迴圈來進行偷懶。不然宣告變數的時候光敲那些變數名都夠耗費時間的了。