2015-11-25 2 views
0

Я пытаюсь динамически выделять массив в куче, используя структуру, которая имеет указатель на массив и строку. Вот мой код.Как динамически выделять массив 2d для структуры

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

Вы приговорены к ручному управлению памятью? Так как это домашнее задание, вы можете быть. Но если нет, просто используйте [std :: vector] (http://en.cppreference.com/w/cpp/container/vector) 'vector's' int' (или просто '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.

Вы не можете динамически выделять 2D-массив за один шаг, например 'new int [rows] [cols]'. Вместо этого вам нужно либо выделить 1D-массив с элементами * cols строк, либо выполнить математику для преобразования строки и col в индекс 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: Это не массив массивов, но это один из нескольких способов реализации концепция 2D-массива. –

+0

немного изменил ответ, чтобы избежать двусмысленности, я понимаю, что массив указателей не совпадает с массивом 2D-массива. – jtedit

Смежные вопросы