2015-11-07 2 views
-1

Когда я скомпилирую его, он говорит, что ученики неинициализированы. В чем проблема?Почему программа дает сообщение об ошибке?

#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

Вы проходите студенческие курсы по значению. Изменение его внутри takeGrade1() не меняет studentGrades в main. – 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

Да, компиляторы, говорящие правду, всегда смущают разработчиков. Даже многие опытные профессионалы никогда не видели такого поведения :) –

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