【问题标题】:How to pass a structure into a function to print using pointers and dynamic memory [C-Programming]如何将结构传递给函数以使用指针和动态内存进行打印 [C 编程]
【发布时间】:2026-01-16 12:15:02
【问题描述】:

我正在尝试将结构传递给将打印内容的函数。我正在寻求任何类型的提示或建议。

结构

struct student
{
    char *fname;
    char *lname;
    float score;
};

创建原型

void printStudents(struct student **s, int student_size);

主要功能

int main()
{
    int base_number, i;
    int students;

    struct student *ptr;

    printf("Enter Number of Students: ");
    scanf("%d", &base_number);
    ptr = (struct student*)malloc(base_number * sizeof(struct student));
    students = base_number;

    printf("\nEnter Student Information\nExample: John Smith 98.50\n\n");

    for(i = 0; i < base_number; i++)
    {
        printf("Student %d: ", i+1);
        scanf("%s %s %f", &(ptr+i)->fname, &(ptr+i)->lname, &(ptr+i)->score);
    }

    printStudents(&ptr, students);

    return 0;
}

printStudents 函数

void printStudents(struct student **s, int student_size)
{
    int i;
    struct student *temp = (struct student*)malloc(student_size * sizeof(struct student));

    for(i = 0; i < student_size; i++)
        printf("%s %s %.2f\n", (temp+i)->fname, (temp+i)->lname, (temp+i)->score);
}

【问题讨论】:

  • 为什么在函数中需要另一个struct temp。您已经将指针传递给struct student 类型的指针,因此只需以与temp 相同的方式打印值。

标签: c pointers memory dynamic structure


【解决方案1】:
  1. 是否需要将指针传递给指针?不能直接传ptr吗?

  2. 为什么要构建另一个数组temp??这只是浪费内存..

.

void printStudents(struct student *s, int student_size);

..

printStudents(ptr, students);

...

void printStudents(struct student *s, int student_size)
{
    int i;

    for(i = 0; i < student_size; i++)
        printf("%s %s %.2f\n", s[i].fname, s[i].lname, s[i].score);
}

【讨论】:

    【解决方案2】:

    结构成员fnamelname 是指向字符的指针,而不是字符数组。因此,scanf 调用

    scanf("%s %s %f", &(ptr+i)->fname, &(ptr+i)->lname, &(ptr+i)->score);
    

    错误并调用未定义的行为。您需要将这些成员设为数组。

    #define MAX_LEN 40
    
    struct student
    {
        char fname[MAX_LEN];
        char lname[MAX_LEN];
        float score;
    };
    

    此外,当您将数组传递给函数时,它会衰减为指向其第一个元素的指针。您不应该在其上使用address of 运算符&amp;。不要转换malloc 的结果。为什么要在printStudents函数中分配内存?它会导致内存泄漏,因为您不释放它。另外,函数参数s 不需要是struct student ** 类型。我建议进行以下更改 -

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_LEN 40
    
    struct student
    {
        char fname[MAX_LEN];
        char lname[MAX_LEN];
        float score;
    };
    
    void printStudents(struct student *s, int student_size);
    
    int main(void)
    {
        int base_number, i;
        int students;
    
        struct student *ptr;
    
        printf("Enter Number of Students:\n");
        scanf("%d", &base_number);
        ptr = malloc(base_number * sizeof *ptr);
        students = base_number;
    
        printf("\nEnter Student Information\nExample: John Smith 98.50\n\n");
    
        for(i = 0; i < base_number; i++)
        {
            printf("Student %d:\n", i+1);
            scanf("%s%s%f", (ptr+i)->fname, (ptr+i)->lname, (ptr+i)->score);
        }
    
        printStudents(ptr, students);
        free(ptr);
    
        return 0;
    }
    
    void printStudents(struct student *s, int student_size)
    {
        int i;
        for(i = 0; i < student_size; i++)
            printf("%s %s %.2f\n", 
                   (s+i)->fname, 
                   (s+i)->lname, 
                   (s+i)->score);
    }
    

    【讨论】:

      【解决方案3】:

      要打印内容,您无需在函数内部创建另一个结构。使用单指针,不需要双指针。使用printStudents(ptr, students);调用函数

      void printStudents(struct student *s, int student_size)
      {
      int i;
      for(i=0;i<student_size;i++)
      printf("%s %s %.2f\n", (s+i)->fname, (s+i)->lname, (s+i)->score);
      }
      

      【讨论】:

        【解决方案4】:

        我认为您的代码中存在错误。

        struct student
        {
            char *fname;
            char *lname;
            float score;
        };
        

        这个定义有问题,你没有为fnamelname 分配内存,但是你在这些变量中存储了character arrat。 也许你可以使用:

           struct student
            {
                char fname[20];
                char lname[20];
                float score;
            };
        

        第二个错误: 当你使用scanf 读取字符串时,只需要这个:

        scanf("%s %s %f", (ptr+i)->fname, (ptr+i)->lname, &(ptr+i)->score);
        

        【讨论】:

          【解决方案5】:

          以下代码将起作用。原型也应该修改。内存应该只分配一次。

          void printStudents(struct student *s, int student_size)
          {
              int i;
              //struct student *temp = (struct student*)malloc(student_size * sizeof(struct student));
          
              for(i = 0; i < student_size; i++)
                  printf("%s %s %.2f\n", (student +i)->fname, (student +i)->lname, (student +i)->score);
          }
          

          以下语句分配了一组没有旧输入数据的新内存,应避免使用。

          struct student *temp = (struct student*)malloc(student_size * sizeof(struct student));
          

          【讨论】: