这是我解决问题的代码"学生成绩总和"在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;
}