2015-11-07 100 views
-1

当我编译它时,它说studentGrades未初始化。那有什么问题?为什么程序给出错误?

#include <iostream> 
    using namespace std; 
    int takeGrade1(int *grades) { 
     int i, noStudents; 
     cout << "No of students: "; 
     cin >> noStudents; 
     grades = new int[noStudents]; 
     for (i = 0; i < noStudents; i++) { 
      cout << "Enter the grade: "; 
      cin >> grades[i]; 
     } 
     return noStudents; 
    } 
    int main() { 
     int *studentGrades, no, i; 
     no = takeGrade1(studentGrades); 
     cout << endl << "Grades: " << endl; 
     for (i = 0; i < no; i++) 
      cout << studentGrades[i] << endl; 
     delete[]studentGrades; 
     return 0; 
    } 
+5

您按照价值传递studentGrades。在takeGrade1()内改变它并不会改变main中的studentGrades。 – drescherjm

+2

更改'int takeGrade1(int * grades)'为'int takeGrade1(int *&grades)' – drescherjm

+0

为什么downvotes? “它说......”并不完全是一种最先进的错误描述,但是人们可以得到这张照片。 –

回答

5

当我编译它,它说studentsGrades初始化。

这是说实话!变量studentsGrades尚未初始化,并且在调用takeGrade1方法时将其值作为参数传递。

这是什么问题?

那么,使用尚未初始化的变量的值的问题是您使用的是未定义的值。程序的运行时行为将是不可预知的。在这种情况下,它很容易因“分段违规”而崩溃。

事实上,你不应该通过studentGrades的价值。你应该通过它的地址;例如改变

int takeGrade1(int *grades) 

int takeGrade1(int *& grades) 

和改变呼叫,等等。或者,更改该方法,使其>>返回数组等等。

+0

是的,编译器说实话总是困惑开发人员。即使很多有经验的专业人士也从未见过这样的行为 –

相关问题