我正在尝试使用具有指向数组和字符串的指针的结构在堆上动态分配数组。这是我的代码。
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];
答案 0 :(得分: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] [cols]'。相反,您需要分配带有行* cols元素的1D数组并执行数学运算以将行和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];
}