我有以下结构:
typedef struct Course {
int course_id;
char* course_name;
int prior_course_id;
StudentTree* students;
} Course;
以及我需要实现的以下功能:
void createReport(FILE* courses[], int numOfCourses, FILE* studentFile, char* reportFileName
你可以看到我得到一个FILE *数组,每个单元格包含不同的文件指针。
我的目的是创建一个数组,每个单元格都是Course *类型,并使用包含从课程文件中读取的数据的Course结构初始化每个单元格。
在函数内声明它的正确方法是什么? 我需要为它动态分配内存,还是可以在编译中完成?
我试过
Course* course_array[numOfCourses] = {NULL};
Course* course_array[numOfCourses] = NULL;
但它不会编译。
感谢您的帮助
答案 0 :(得分:1)
Course* course_array[numOfCourses] = {NULL};
这很好,但它会创建Course *
数组。因此,在访问它之前,需要为course_array
中的每个指针分配内存。
像
这样的东西course_array[0] = malloc(sizeof(Course));
course_array[0]->course_id = someid;
答案 1 :(得分:1)
您声明一个结构数组的方式与声明int
或FILE *
s数组的方式相同:
Type variableName[numberOfElements];
在C99之前(并禁止编译器特定扩展),不支持在堆栈上创建array with a variable number of elements。因此,请确保您的目标是正确的标准。在您的情况下,假设C99支持,以下应该有效:
Course *course_array[numOfCourses];
因为您打算初始化数组中的每个元素,所以不需要将它们清零。
然后您将访问以下元素:
course_array[0] = malloc(sizeof(Course))
course_array[0]->course_id = 2;
/* etc. */
现在,如果你不能承担C99的支持,事情会变得有点棘手,但并不多:
Course *course_array = malloc(sizeof(Course *) * numOfCourses);
之后,您可以使用相同的数组表示法访问course_array
:
course_array[0] = malloc(sizeof(Course))
course_array[0]->course_id = 42;
/* etc. */
在您对阵列进行操作后,您需要确保free
您分配的任何内存:
for (i = 0; i < numOfCourses; i++) {
free(course_array[i]);
}
/* If you malloc'd course_array, then you need this too */
free(course_array);
答案 2 :(得分:0)
首先定义数组时,不需要分配内存。你正在堆栈上定义数组,而数组的元素只是指针。
我认为你应该做的是先定义数组,然后用malloc调用初始化每个元素。例如:
Course* course_array[numOfCourses];
for(int i = 0; i < numOfCourses, i++) {
course_array[i] = (Course*)malloc(sizeof(Course));
答案 3 :(得分:0)
我最喜欢的方式:
typedef struct {
int a;
char b;
float c;
}DATA;
//then use typdef'ed DATA to create array (and a pointer to same)
DATA data[10], *pData;
//then, in function, you can initialize the pointer to first element of array this way:
int main(void)
{
pData = &data[0];
return 0;
}
您的示例代码如下所示 :
typedef struct {
int course_id;
char* course_name;
int prior_course_id;
StudentTree* students;
} COURSE;
//then in function:
COURSE course[numOfCourses]