我不明白这次崩溃

  • 本文关键字:崩溃 明白 c
  • 更新时间 :
  • 英文 :


这是我解决问题的代码"学生成绩总和"在Hackerrank:(链接:https://www.hackerrank.com/challenges/students-marks-sum/problem?)

#include <string.h>
#include <math.h>
#include <stdlib.h>
//Complete the following function.
int marks_summation(int* marks, int number_of_students, char gender) {
int result = 0;

switch (gender){
case 'b':
while(marks != NULL){
result += (*marks);
marks += 2;
}
case 'g':
++marks;
while(marks != NULL){
result += (*marks);
marks += 2;
}
break;
}

return result;
}
int main() {
int number_of_students;
char gender;
int sum;

scanf("%d", &number_of_students);
int *marks = (int *) malloc(number_of_students * sizeof (int));

for (int student = 0; student < number_of_students; student++) {
scanf("%d", (marks + student));
}

scanf(" %c", &gender);
sum = marks_summation(marks, number_of_students, gender);
printf("%d", sum);
free(marks);

return 0;
}

当我将这段代码移动到IDE中时(在我的情况下,它是DEV C/c++),当我的调试运行到我的函数marks_summation时,它崩溃了。

行错误:

result += (*marks); 

问题在于您的假设,如果您移出动态分配内存的范围,指针值将更改为NULL:

while(marks != NULL){
result += (*marks);
marks += 2;
}

可以选择多种方法来遍历这样的数组。

你可以计算出不再有效读取的内存地址,并在每次迭代时检查指针是否小于它:

int marks_summation(int* marks, int number_of_students, char gender) {
int result = 0;
int* marksEnd = marks + number_of_students;

switch (gender){
case 'b':
while(marks < marksEnd){
result += (*marks);
marks += 2;
}
case 'g':
++marks;
while(marks < marksEnd){
result += (*marks);
marks += 2;
}
break;
}
return result;
}

最新更新