【问题标题】:Vector of pointers with dynamic memory allocation in CC中具有动态内存分配的指针向量
【发布时间】:2017-03-16 13:47:23
【问题描述】:

作为作业的一部分,我正在学习 C 中的指针向量。但是,我的代码的一部分没有运行,我不明白为什么。 尽管我的问题特别在于 selectApproved 函数,但我已经包含了下面的完整代码。

我只是在 selectApproved 功能中遇到问题。它接收一个 Student 类型的指针向量,这是我定义的一个结构,它的元素中有两个不同测试的等级。该函数应该递归地识别获得及格结果的学生(定义为 test1 + test2 >= 10)并返回一个指针向量,其中指针向量的每个元素都包含一个指向 Student 的指针 结构。

在语句 printf("Position %d\n", position); 被定位后发生错误,在所有递归调用发生后。具体来说,我知道错误发生在以下语句中:approved_students[position] = vector[position];

我不明白为什么会发生此错误。在所有递归调用发生后,我动态分配我的指针向量以准确保存通过的学生人数:approved_students = (Student **) malloc( (*passed) * sizeof(Student *)) .据我了解,approved_student 应该具有与 *passed 完全相同的“插槽”数量(在本例中为 4 个插槽)。 我什至在 if 语句 if(num_students == 0) 中处理没有学生被批准的事件。

我知道我的递归函数运行良好,因为 printf("Position %d\n", position); 打印出 3,这意味着 4 名学生已按预期获得批准(学生 0,1,2,3 已获得批准)。我使用的 IDE (Visual Studio 2012) 允许我执行 approved_students[position] = vector[position];。 在我看来,这句话是说,例如 approved_students[position] 将包含一个指向位于 vector[position] 中的结构的指针。毕竟,approved_student 是一个指针向量。

我真的不知道为什么该功能不起作用。有人可以帮忙吗? 我觉得

# include <stdio.h>
# include <stdlib.h>
# include <string.h>

struct Studentgrade{    

    float test1;
    float test2;

};

typedef struct Studentgrade Grade;

struct student

{   

    int ID_number;
    char name[51];
    Grade *scores;

};

typedef struct student Student;

Student *createStudent(int ID_num, char name_student[], float test1_grade, float test2_grade){

    int i = 0;
    Student *newStudent = (Student *) malloc(sizeof(Student));

    if (newStudent == NULL){

        printf("Error in memory allocation\n");
        exit(1);

    }

    newStudent->scores = (Grade *) malloc(sizeof(Grade));

    if (newStudent->scores == NULL){

        printf("Error in memory allocation\n");
        exit(1);

    }

    newStudent->scores->test1 = test1_grade;
    newStudent->scores->test2 = test2_grade;

    newStudent->ID_number = ID_num;

    while(i < 51  && name_student[i] != '\0')

        newStudent->name[i] = name_student[i++];

    newStudent->name[i] = '\0';

    return newStudent;
}

Student **selectApproved(Student *vector[], int num_students, int *passed){

    int position;
    int i;
    float comparison;
    Student **approved_students = NULL;

    if(num_students == 0){

        if(*passed == 0){

            printf("No student passed\n");
            return NULL;


        }

        else{

            approved_students = (Student **) malloc( (*passed) * sizeof(Student *));

            /*for (i = 0; i < (*passed); i++)

            approved_students[i] = (Student *) malloc(sizeof(Student *));*/

            if (approved_students == NULL){

                printf("Error in memory allocation\n");
                exit(1);
            }

            return approved_students;
        }
    }

    comparison = (vector[0]->scores->test1) + (vector[0]->scores->test2);

    if(comparison >= 10){

        position = *passed;
        (*passed)++;

        approved_students = selectApproved(&vector[1], num_students - 1, passed);

        printf("Position %d\n", position);

        approved_students[position] = vector[position];


    }

    else

        selectApproved(&vector[1], num_students - 1, passed);

    return approved_students;

}

int main(void){

    Student *vpstudent[12]; 
    Student **vpstudent2;
    int i = 0;
    vpstudent[0] = createStudent(444,"Rita",6.4, 7.8);
    vpstudent[1] = createStudent(111,"Rita",5.6, 8.8);
    vpstudent[2] = createStudent(999,"Rita",8.2, 7.1);
    vpstudent[3] = createStudent(555,"Dina",2.7, 6.4);
    vpstudent[4] = createStudent(777,"Lana",9.5, 5.3);
    vpstudent[5] = createStudent(666,"Tais",2.2, 2.8);
    vpstudent[6] = createStudent(222,"Cris",3.1, 4.2);
    vpstudent[7] = createStudent(333,"Vera",4.4, 5.4);
    vpstudent[8] = createStudent(888,"Cris",4.4, 5.4);
    vpstudent[9] = createStudent(303,"Vera",4.4, 5.4);
    vpstudent[10] = createStudent(101,"Cris",5.4, 3.4);
    vpstudent[11] = createStudent(202,"Vera",1.4, 8.4);

    vpstudent2 = selectApproved(vpstudent, 12, &i);
    return 0;

}

【问题讨论】:

  • 由于您发布的代码中没有任何内容实际调用selectApproved,因此很难判断您是如何收到此错误的。
  • C 没有向量类型。你的意思是数组?并且一般不要投射malloc & friends 或void * 的结果。
  • Tibrogargan,我刚刚纠正了这一点(缺少对 selectApproved 的调用)。还有奥拉夫,我所说的向量是指数组。

标签: c pointers recursion vector dynamic-memory-allocation


【解决方案1】:

看来您依赖最终递归到 selectApproved 来为您的向量分配内存。

但是,您不能保证分配的指针实际上会返回到调用堆栈中。

“if(comparison >= 10)”的 Else 条件不会加载approved_students。

 if(comparison >= 10){
   ...
    approved_students = selectApproved(&vector[1], num_students - 1, passed);
   ...
} else {
    approved_students = selectApproved(&vector[1], num_students - 1, passed);
}   

return approved_students;

基于此,我会说最深递归级别的学生没有通过。

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2017-04-03
    相关资源
    最近更新 更多