对于任何类型的T,您可以通过以下两种方式之一获得T 数组:
- 作为数组对象:
T arr[N];
- 作为指向
T 的指针,您可以为其动态分配内存:T *arr = malloc( sizeof *arr * N );
因此,在您的 Film 类型中,您可以执行以下任一操作:
typedef struct film{
Title_Film * Title; //pointer to structure
int year;
type genre; //enum
director * director_Film; //pointer to structure
Actor cast[N]; // where N is known at compile time
}Film;
或
typedef struct film{
Title_Film * Title; //pointer to structure
int year;
type genre; //enum
director * director_Film; //pointer to structure
Actor *cast;
}Film;
在第一种情况下,您只需要创建Film 实例即可同时创建cast 数组:
Film jaws;
jaws.cast[0].name = strdup( "Roy" ); // assumes strdup is available
jaws.cast[0].surname = strdup( "Scheider" ); // otherwise you'll have to use
jaws.cast[1].name = strdup( "Richard" ); // a combination of malloc and
jaws.cast[1].surname = strdup( "Dreyfuss" ); // strcpy
等等
在第二种情况下,需要额外的步骤来为cast 数组分配内存:
Film jaws2;
jaws2.cast = malloc( sizeof *jaws2.cast * cast_size );
jaws2.cast[0].name = strdup( "Roy" );
jaws2.cast[0].surname = strdup( "Scheider" );
等等。
在这两种情况下,完成后,您都需要 free 每个 cast[i].name 和 cast[i].surname。在第二种情况下,您还需要free cast 成员本身(每个malloc/calloc 应该在某处有一个对应的free)。
由于薄膜之间的流延尺寸不同,第二种方法更可取,因为它可以根据每个薄膜的需要调整尺寸。此外,如果您以后需要扩展它,它还允许您使用realloc resize 数组。一个更好的解决方案是使用可以根据需要增长和缩小的链接列表或类似容器,但这是一个bit 更多的工作。
不清楚为什么需要Title_Film 类型中的Actors 成员;由于演员与电影相关联,因此标题已经存在。
说实话,建模多对多关系(电影有多个演员,演员出现在多部电影中)的正确方法是Film不包含@数组987654345@ 或反之亦然;相反,您应该有单独的 Film 和 Actor 数组(或列表,或树,等等),并创建一个关联类型的 附加 数组(或列表,或树,等等)个人Actor 条目到Film 条目:
struct assoc {
Actor *actor;
Film *film;
} ActorFilmAssoc;
Actor *findActor( Actor *list, const char *surname, const char *name ) { ... }
Film *findFilm( Film *list, const char *title ) { ... }
Actor *actors = calloc( num_actors, sizeof *actors );
Film *films = calloc( num_films, sizeof *films );
/**
* Add entries to actors and films
*/
ActorFilmAssoc *map = calloc( someSize, sizeof *map );
size_t entry = 0;
...
map[++entry].actor = findActor( actors, "Scheider", "Roy" );
map[entry].film = findFilm( films, "Jaws" );
map[++entry].actor = findActor( actors, "Scheider", "Roy" );
map[entry].film = findFilm( films, "All That Jazz" );
我们不是在每部电影中为 Roy Scheider 存储多个 Actor 条目,而是将单个条目存储在 actors 数组中,并且在 map 中只有多个指向它的指针。
这是一个非常简单的例子;您将想要为您的地图使用比线性数组更复杂的东西。但它应该说明这个概念。