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

时间:2015-03-01 09:55:31

标签: c arrays struct

我这几天一直在研究这个问题,无法弄清楚我做错了什么。我有一个结构...

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);
    }
}

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

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

这是我的功能,我已经尽可能地简化了它,在过去的几天里,我设法发现我能够打印出阵列中的第一个元素,但是我不能打印出任何其他人,主要是我通过我的功能......

addNewCourse(&allClasses);

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

5 个答案:

答案 0 :(得分:2)

allClassescourse的数组,您期望指向course的指针数组:

void addNewCourse(course *allClasses[])

更改为

void addNewCourse(course *allClasses)
  是的,我故意这样做,因为我想分配内存

如果要通过函数为n course分配内存:

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);

答案 1 :(得分:2)

数组下标优先于解除引用运算符。

*allClasses[1]然后是*(allClasses[1]),您需要(*allClasses)[0]

还要记住,数组在传递给函数时会衰减为指向第一个元素的指针,因此最好避免像course *allClasses[]这样的语法。

呼叫

addNewCourse(&allClasses);

然后,

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您没有在示例中显示,但似乎您想为新课程分配内存,因此您必须将courses数组的地址作为指针传递给指针并通过{{访问它1}}。

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

(*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]`之间的歧义。

这是带控件结构的ame示例:

*a[i]