我写了一个程序,接受学生人数和科目数。我需要接受每个学生的所有科目的分数,并打印每个学生的总分。 因为我们不知道学生/科目的数量,所以我使用了指针而不是数组。 导致问题的功能可能是这样的: n =学生,m =科目,sm是包含指针'标记'的结构的指针对象。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void accept(int,int); //Function Prototype
void calc(int,int);//Function Prototype
void print(int);//Function Prototype
struct student{
float *marks;
}*sm;
float *total;
int main(){
int n,m;
printf("Enter number of students(N) and number of subjects(M) \n");
scanf("%d%d",&n,&m);
sm=malloc(n);
sm->marks=malloc(m);
total=malloc(n);
accept(n,m);
calc(n,m);
print(n);
return 0;
}
void accept(int n,int m){ //Accepts data
int i,p;
for(i=0;i<n;i++){
printf("Enter the marks of student %d in each subject in order and separated by a space/line \n",i+1);
for(p=0;p<m;p++){
scanf("%f",(sm+i)->marks+p);
}
}
}
void calc(int n,int m){ //Calculates total marks
int i,p,tot=0;
for(i=0;i<n;i++){
for(p=0;p<m;p++){
tot+=*((sm+i)->marks+p);
}
*(total+i)=tot;
tot=0;
}
}
void print(int n){//Print the total marks of each student
int i,tot=0;
for(i=0;i<n;i++){
printf("Total marks for student %d is:%0.2f \n",i+1,*(total+i));
}
}
只要学生人数> 1,程序就会崩溃。我不明白为什么,我已经尝试了很多方法来修复它,但到目前为止还没有。 我的错是什么?
答案 0 :(得分:2)
在main
函数中,您有以下这一行:
sm=malloc(n);
分配n
字节 。不是n
结构元素。因此,您很可能会远离您分配的内存范围,并且未定义的行为。
你需要做
sm = malloc(n * sizeof *sm); // Allocates n structures
然后通过将sm
视为指向单个结构的指针,当它应该是一个数组时,你会变得更糟。
答案 1 :(得分:1)
你必须为每个sm-&gt;标记malloc内存。
for (int i = 0; i < n; ++i) {
sm[i].marks=malloc(m*sizeof(float));
}
答案 2 :(得分:0)
两点:
你需要为每个学生分配记忆,即你的学生 情况下:
sm = malloc(n * sizeof (*sm));
在内部结构中,你使用了float *并且在使用malloc时,你是 使用int即m,这不是一个好兆头,同样的东西也是一样的。 在您的代码中更新它。
。