我这几天一直在研究这个问题,无法弄清楚我做错了什么。我有一个结构...
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);
我真的不知道该怎么做了,我已经尝试了所有的东西,我已经阅读了所有可能的答案而无法找到问题的解决方案,请帮助
答案 0 :(得分:2)
allClasses
是course
的数组,您期望指向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]