Reputation: 430
I'm getting the error "expected expression before 'struct'" on the the first line in the function allocate() below. I cant figure out why.
I should say that I've been tasked to make this code work with the structure / function headers provided.
Any help is much appreciated!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <time.h>
struct student{
int id;
int score;
};
struct student* allocate(){
/*Allocate memory for ten students*/
struct student *stud = malloc(10 * sizeof struct *student);
assert (stud !=0);
return stud;
}
void generate(struct student *students){
/*Generate random ID and scores for ten students, ID being between 1 and 10, scores between 0 and 100*/
srand(time(NULL));
// Generate random ID's
int i;
for(i=0; i<10; i++){
students[i].id = rand()*10+1;
}
//Generate random scores
for(i=0; i<10; i++){
students[i].score = rand()*10+1;
}
}
void output(struct student* students){
//Output information about the ten students in the format:
int i;
for(i=0; i<10; i++){
printf("ID-%d Score-%d\n", students[i].id, students[i].score);
}
}
void summary(struct student* students){
/*Compute and print the minimum, maximum and average scores of the ten students*/
int min = 100;
int max = 0;
int avg = 0;
int i;
for(i=0; i<10; i++){
if(students[i].score < min){
min = students[i].score;
}
if(students[i].score > max){
max = students[i].score;
}
avg = avg + students[i].score;
}
avg = avg/10;
printf("Minimum score is %d, maximum score is %d, and average is %d.", min, max, avg);
}
void deallocate(struct student* stud){
/*Deallocate memory from stud*/
free (stud);
}
int main(){
struct student *stud = NULL;
/*call allocate*/
stud = allocate();
/*call generate*/
generate(stud);
/*call output*/
output(stud);
/*call summary*/
summary(stud);
/*call deallocate*/
deallocate(stud);
return 0;
}
Upvotes: 4
Views: 46082
Reputation: 15642
Your problem is in sizeof struct *student
. When using the sizeof
operator on a typename, you need to parenthesize the typename. In addition, as Jonathan Leffler identified in the comments to this answer, the placement of *
in struct *student
is erroneous, and the use of struct student *
would be incorrect in the context of this code. Perhaps you meant: sizeof (struct student)
.
Alternatively, you could use sizeof
on an expression, and you won't need the parenthesis. This would be preferable, because if you choose to change the type of stud
then you won't need to replace an extra typename when you do so: struct student *stud = malloc(10 * sizeof *stud);
Upvotes: 1
Reputation: 34275
You may want to write
sizeof(struct student)
instead of
sizeof struct *student
Upvotes: 10