如何访问声明为struct类型的指针变量的值

时间:2014-10-27 14:36:48

标签: c pointers struct

我正在尝试将学生的记录存储在名为student的指针变量中。 我将指针变量声明为一种struct student_info,如代码所示,并在我们想要输入学生记录时使用malloc为学生变量分配内存。我想访问第i个学生并尝试输入该值的值。我试图使用以下代码访问ith元素,但它无法正常工作。每当我试图打印存储在学生变量中的值时,它总是显示为零。请告诉我这段代码中的错误,我访问元素的方式是否正确。

#include<stdio.h>
#include<stdlib.h>
int i;
struct student_info
{
    int id;
    char name[20];
    int quiz1;
    int quiz2;
    int total_score;
};

int choice();
int add_record(struct student_info *);

int main()
{
  int option;
  struct student_info *student;
  student = (struct student_info *) malloc(sizeof(struct student_info));
  while (1)
  {
    option = choice();
    if (option == 1)
    {
      add_record(student);
    }
    else
    {
      exit(0);
    }
  }
  return 0;
}

int choice()
{
  int option;
  printf("------------------------------------\n");
  printf("------------------------------------\n");
  printf("\t\tMenu\t\t\n");
  printf("------------------------------------\n");
  printf("------------------------------------\n");
  printf("1. Add student record\n");
  printf("0. exit\n")
  printf("Enter your choice\n");
  scanf("%d", &option);
  return option;
}

int add_record(struct student_info * student)
{
  if (i != 0)
  {
    student = (struct student_info *) malloc(sizeof(struct student_info) * (i + 1));
  }
  (student + i)->id = i;
  printf("enter student name");
  scanf("%s", (student + i)->name);
  printf("Enter quiz 1 marks");
  scanf("%d", &(student + i)->quiz1);
  printf("Enter quiz 2 marks");
  scanf("%d", &(student + i)->quiz2);
  (student+i)->total_score = (student +i)->quiz1 + (student+i)->quiz2;
  i++;
  printf("Total_score %d\n", *&(student + i)->total_score);
  return 0;
}

2 个答案:

答案 0 :(得分:2)

您在malloc()中使用add_record()似乎增加了现有分配。这不起作用。

您应该查看realloc(),因为malloc() 不会保留旧块的数据。

此外,stop casting the return value of malloc()。切换后,不要将realloc()的返回值强制转换。

此外,拥有一个名为i的全局变量是一个非常糟糕的主意。

答案 1 :(得分:0)

您的代码中存在以下几个错误: - 1.你的结构中没有任何名为mid_term和final_score的变量,但是你在代码中使用它。 2.你为同一个结构指针分配两次内存;一个在main中,另一个在add_record函数中。 3.你正在做的非常愚蠢的错误是你在打印ith学生的分数之前递增我,这就是为什么你得到0作为最终分数。

这里我假设有N个学生可以添加到记录中,N可以根据您的需要进行更改。这是您的工作代码。

#include<stdio.h>
#include<stdlib.h>
int i;
struct student_info
{
int id;
char name[20];
int quiz1;
int quiz2;
int total_score;
};

int choice();
int add_record(struct student_info *);

int main()
{
int option,N=15;
struct student_info *student;
student = (struct student_info *)malloc(sizeof(struct student_info)*N);
while(1)
{
option = choice();
if(option == 1)
{
add_record(student);
}
else
{
exit (0);
}
}
return 0;
}

int choice()
{
int option;
printf("------------------------------------\n");
printf("------------------------------------\n");
printf("\t\tMenu\t\t\n");
printf("------------------------------------\n");
printf("------------------------------------\n");
printf("1. Add student record\n");
printf("0. exit\n");
printf("Enter your choice\n");
scanf("%d",&option);
return option;
}

int add_record(struct student_info * student)
{

(student+i)->id = i;
printf("enter student name");
scanf("%s",(student+i)->name);
printf("Enter quiz 1 marks");
scanf("%d",&(student+i)->quiz1);
printf("Enter quiz 2 marks");
scanf("%d",&(student+i)->quiz2);
(student+i)->total_score = (student +i)->quiz1 + (student+i)->quiz2;

printf("Total_score %d\n",*&(student+i)->total_score);
i++;
return 0;
}