我需要帮助将结构数组传递给函数
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
如果你想通过一个函数为ncourse
s分配内存:
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;
}
我已经为此工作了好几天了,无法弄清楚我做错了什么。我有一个结构...
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
如果你想通过一个函数为ncourse
s分配内存:
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;
}