2015-11-25 143 views
0

我想動態分配堆上的數組使用具有指向數組和字符串的指針的結構。這是我的代碼。如何動態分配一個二維數組結構

struct StudentRecords 
    { 
    string names; 
    int* examsptr; 
    }; 


    void main() 
    { 


const int NG = 5; 

string names[] = { "Amy Adams", "Bob Barr", "Carla Carr", 
        "Dan Dobbs", "Elena Evans" 
        }; 

int exams[][NG] = 
{ 
    { 98,87,93,88 }, 
    { 78,86,82,91 }, 
    { 66,71,85,94 }, 
    { 72,63,77,69 }, 
    { 91,83,76,60 } 
}; 

StudentRecords *data = nullptr; 
(*data).examsptr = new int[][NG]; 

int *data = new int[NG*NG]; 
+1

你應該修復複製+粘貼到StackOverflow上使代碼更易於閱讀時可能發生的壓痕。還要注意['void main' **不是**有效的C++](http://www.stroustrup.com/bs_faq2.html#void-main) – Tas

+1

當''data'是'nullptr'時'。在到達結構之前,這將失敗。哦,你有兩個變量叫做'data'。也不會去工作。 –

+3

你是否被譴責爲手動內存管理?因爲這可能是一項家庭作業。但是,如果沒有,只需使用[int]的vector的[std :: vector](或簡單的'std :: vector '並且不要打擾 – user3159253

回答

0

您當前的代碼存在很多問題。

StudentRecords *data = nullptr; //here you set data to nullptr 
(*data).examsptr = new int[][NG]; //then you dereference nullptr, BAD 

int *data = new int[NG*NG]; //then you declare another variable with the same name, BAD 

您應該重命名其中一個變量並將學生記錄設置爲StudentRecords的實際實例。

你不能像'new int [rows] [cols]'一樣動態地分配2D數組。相反,您需要分配一個帶有行* cols元素的1D數組,並執行數學運算來將行和列轉換爲1D數組的索引,或者您需要分配一個指針數組,其中每個指針指向一個包含數據的數組。爲了容納指針數組,你需要一個指向指針的指針,所以你需要使examsptr成爲一個int **。您需要分配循環中指針數組指向的數組。

EG:

//cant be nullptr if you want to dereference it 
StudentRecords *data = new StudentRecords(); 

//data-> is shorthand for (*data). 
//allocates array of pointers, length NG 
data->examsptr = new int*[NG] 

//now make the 2nd dimension of arrays 
for(int i = 0; i < NG; ++i){ 
    data->examsptr[i] = new int[NG]; 
} 
+0

指針數組不是一個二維數組... – immibis

+0

@immibis:它不是一個數組數組,但它是實現二維數組的概念 –

+0

編輯了一下回答了一下,以避免模糊不清,我意識到一個指針數組是不一樣的堆棧分配二維數組。 – jtedit