如何正确定义结构数组?

时间:2014-04-30 18:32:32

标签: c arrays struct

我有以下结构:

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;

但它不会编译。

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

Course* course_array[numOfCourses] = {NULL};

这很好,但它会创建Course *数组。因此,在访问它之前,需要为course_array中的每个指针分配内存。

这样的东西
course_array[0] = malloc(sizeof(Course));
course_array[0]->course_id = someid;

答案 1 :(得分:1)

您声明一个结构数组的方式与声明intFILE * 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]