我需要帮助将结构数组传递给函数

I need help passing an array of structs to a function

我已经为此工作了好几天了,无法弄清楚我做错了什么。我有一个结构...

typedef struct{

   int usedFlag;
   char *course; /*size: NAME*/
   int courseID;
   int numberOfStudents;
   int *studentID; /*size: MAXSTDINCLS*/
   grades *assignments; /*size: MAXGRDS*/
}course;

typedef  struct
{

   char *assignment;/*size: NAME*/
   int *grades; /*size: MAXSTDINCLS*/
}grades;

这就是我分配内存的方式...

course *allClasses;
allClasses = (course*)malloc(sizeof(course)*CLSSIZE);

for (counter= 0; counter < CLSSIZE; counter++)
{
    allClasses[counter].course = (char*)malloc(sizeof(char)*NAME);
    allClasses[counter].studentID = (int*)malloc(sizeof(int)*MAXSTDINCLS);
    allClasses[counter].assignments = (grades*)malloc(sizeof(grades)*MAXGRDS);
    /*memory allocation for all of grades arrays, using "courses" array of "grades"*/
    for(secondCounter = 0; secondCounter < MAXGRDS; secondCounter++)
    {
        allClasses[counter].assignments[secondCounter].assignment = (char*)malloc(sizeof(char)*NAME);
        allClasses[counter].assignments[secondCounter].grades = (int*)malloc(sizeof(int)*MAXSTDINCLS);
    }
}

所以 none 这给我带来了麻烦,但是,我需要将这个数组传递给一个函数,在函数中我将接收信息或重新分配内存以使数组更大,并且这是我遇到问题的地方。

void addNewCourse(course *allClasses[])
{
    printf("%d", (*allClasses[0]).courseID);
    printf("%d", (*allClasses[1]).courseID);
}

这是我的函数,我已经尽可能地简化了它,在过去的几天里,我设法发现我能够打印出数组中的第一个元素,但我可以'打印出任何其他的,主要是,我像这样传递我的函数...

addNewCourse(&allClasses);

我真的不知道该尝试什么了,我已经尝试了所有方法,我已经阅读了所有可能的答案,但找不到解决我问题的方法,请帮助

allClasses 是一个 course 的数组,你期望一个指向 course:

的指针数组
void addNewCourse(course *allClasses[])

改为

void addNewCourse(course *allClasses)

yeah i did it that way intentionally because i want to allocate memory

如果你想通过一个函数为ncourses分配内存:

void addNewCourse(course **allClasses, int n)
{
    *allClasses = malloc(sizeof(course) * n);
    /* ... */
}

course *allClasses;
addNewCourse(&allClasses, CLSSIZE);

course *addNewCourse(int n)
{
    course *allClasses = malloc(sizeof(course) * n);
    /* ... */
    return allClasses;
}

course *allClasses;
allClasses = addNewCourse(CLSSIZE);

数组下标比取消引用运算符具有更高的优先级。

*allClasses[1]那么*(allClasses[1]),你需要(*allClasses)[0].

还请记住,当传递给函数时,数组会衰减为指向第一个元素的指针,因此最好避免像 course *allClasses[].

这样的语法

通话

addNewCourse(&allClasses);

然后,

void addNewCourse(course **allClasse)
{
    printf("%d", (*allClasses)[0].courseID);
    printf("%d", (*allClasses)[1].courseID);
}
void addNewCourse(course *allClasses)
{
    printf("%d", allClasses[0].courseID);
    printf("%d", allClasses[1].courseID);
}

这应该有效。因为 allClasses 当然是一个指针。

分而治之
把它分解成一个分配内存的函数,比如

course* allocateCourseArray( int );

和其他填写值/读取值等

void writeToCourseArray( course*, int );
void printCourseArray( course*, int );

像这样使用它们:

const int SZ = 5;
course* myArr = allocateCourseArray(SZ);
writeToCourseArray(myArr,SZ);
printCourseArray(myArr,SZ);

writeToCourseArray 中,您可以使用
访问各个元素 arrayname[indexnumber].membername 语法

如果数组需要动态改变大小,还需要一个

course* resizeCourseArray( course*, int );

realloc 使其易于实施。像这样使用:

myArr = resizeCourseArray( myArr, newsize );

请注意,传统上用户定义的类型都是大写的,例如 Course

你没有在你的例子中显示,但你似乎想为新课程分配内存,所以你必须将你的 courses 数组的地址作为指向指针的指针传递并通过访问它(*arr)[i].

您还需要一种方法来传递数组的长度并更新它。这可以是一个额外的变量,也可以是数组末尾的标记条目。

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

typedef struct Course Course;

struct Course {
    int id;
    const char *name;
};

void add_course(Course **courses, int *n, int id, const char *name)
{
    *courses = realloc(*courses, (*n + 1) * sizeof(**courses));

    (*courses)[*n].id = id;
    (*courses)[*n].name = name; 
    (*n)++;
}

int main()
{
    Course *courses = NULL;    
    int i, n;

    add_course(&courses, &n, 1101, "Biology (Basic)");
    add_course(&courses, &n, 1102, "Biology (Intermediate)");
    add_course(&courses, &n, 1103, "Biology (Expert)");

    add_course(&courses, &n, 2101, "Pig Latin");

    for (i = 0; i < n; i++) {
        printf("%8d   %s\n", courses[i].id, courses[i].name);
    }

    free(courses);

    return 0;
}

此解决方案有效,但您必须注意元素的实际数量和计数器 n 始终保持同步。将它们捆绑到一个单独的结构中可能是个好主意。您将指向此控制结构的指针传递给函数,并且可以消除指针到指针的语法以及 *a[i] 和 (*a)[i]` 之间的歧义。

下面是一个带有控制结构的例子:

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

typedef struct Curriculum Curriculum;
typedef struct Course Course;

struct Course {
    int id;
    const char *name;
};

struct Curriculum {
    Course *courses;
    size_t n;
};

void add_course(Curriculum *curr, int id, const char *name)
{
    int n = curr->n++;

    curr->courses = realloc(curr->courses,
        curr->n * sizeof(*curr->courses));

    curr->courses[n].id = id;
    curr->courses[n].name = name; 
}

void print_courses(const Curriculum *curr)
{
    int i;

    for (i = 0; i < curr->n; i++) {
        printf("%8d   %s\n",
            curr->courses[i].id, 
            curr->courses[i].name);
    }
}

int main()
{
    Curriculum curr = {NULL};

    add_course(&curr, 1101, "Biology (Basic)");
    add_course(&curr, 1102, "Biology (Intermediate)");
    add_course(&curr, 1103, "Biology (Expert)");

    add_course(&curr, 2101, "Pig Latin");

    print_courses(&curr);    
    free(curr.courses);

    return 0;
}