2012-04-28 161 views
0

我需要在堆上声明一个结构数组,然后将数据从堆栈中的并行数组传输到计算结构中。我宣布在C++中在堆上创建一个结构数组

struct Grades 
{ 
    string studentName; 
    int  scores[4]; 
    double average; 
}; 

.... 

Grades *art1301 = new Grades; 

.... 

(art1301 + i)->studentName = names[i]; 

for((int i = 0 ; i < 5 ; i++) 
(art1301 + i)->scores[j] = exams[i][j]; 

(art1301 + i)->average = average; 

我的程序访问的第一个记录,但它崩溃它访问的第二记录的第一场之后。我不明白它为什么会在第一张唱片上奏效,但是在第二张唱片中死亡?我正确访问结构吗?

谢谢。

+0

这是一个提示:这是错误的(为了你的目的):'成绩* art1301 =新成绩;' – chris 2012-04-28 22:10:13

+0

你在堆上只声明一个成绩结构。您没有足够的内存分配给多个人,所以您可能会因此而违反书面规定。为了能够在堆上工作一个以上的成绩,那么这个改变应该是'Grades * art1301 = new Grades [i + 1]',我假设i + 1是你想要分配的结构数。 – 2012-04-28 22:10:53

+0

请不要使用指针算术来索引数组。使用索引操作符'[]'。 – 2012-04-28 22:19:40

回答

2

要分配一个数组,你需要的new阵列形式,用方括号:

Grades *art1301 = new Grades[200]; 
//       ^^^^^ 

Ť他的数组大小可以是一个动态确定的数量。

+0

谢谢。添加数组大小可使整个程序正常工作。我的任务已完成。 – Opcode 2012-04-28 22:24:53

0

您没有为数组分配内存,只是为一个元素分配内存。

正如有人在评论中说,关键是在new Grades指令

另外,除非你有另一i变量声明之前(这是一个不好的做法),代码不编译,因为(art1301 + i)->studentName = names[i];会找不到可变i