使用C崩溃中的指针编程。无法找到错误

时间:2016-08-26 09:30:17

标签: c

我写了一个程序,接受学生人数和科目数。我需要接受每个学生的所有科目的分数,并打印每个学生的总分。 因为我们不知道学生/科目的数量,所以我使用了指针而不是数组。 导致问题的功能可能是这样的: 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,程序就会崩溃。我不明白为什么,我已经尝试了很多方法来修复它,但到目前为止还没有。 我的错是什么?

3 个答案:

答案 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,这不是一个好兆头,同样的东西也是一样的。   在您的代码中更新它。