是否有动态数组?

时间:2011-03-31 00:55:46

标签: c arrays struct

如果我在一个类中创建一个结构

typedef struct
{     
    int numberOfTiles;
    // an array of ints here
    int *tileArray; 

} CollisionLayer;

是否可以使用空[]创建一个int数组并在创建时设置大小?或者如何创建这个数组?用指针动态?在创建其中一个struct“对象”时我会知道数组的大小,如果可以在创建时填充数组的大小,那么在上面的结构中如何声明数组?

4 个答案:

答案 0 :(得分:3)

您需要自己初始化阵列:

CollisionLayer layer;
layer.numberOfTiles = numberOfTiles;
layer.tileArray = (int*)malloc(sizeof(int) * numberOfTiles);

或者,如果要在堆上创建结构:

CollisionLayer* pl  = (CollisionLayer*)malloc(sizeof(CollisionLayer));
pl->numberOfTiles = numberOfTiles;
pl->tileArray = (int*)malloc(sizeof(int) * numberOfTiles);

// When you are done:
free(pl->tileArray);
free(pl);

另一种选择是将固定大小限制硬编码为CollisionLayer,例如:

typedef struct
{     
    int numberOfTiles;
    // an array of ints here
    int tileArray[100]; 

} CollisionLayer;

当然,这在所有方面都不太理想,但如果您不想手动管理内存,这是您唯一的选择。

答案 1 :(得分:2)

如果在编译时不知道大小,则必须在运行时使用malloc()分配内存。要在C中使用实际数组,必须知道编译代码时的大小。

答案 2 :(得分:1)

tileArray是指向int的指针。 malloc / calloc应该用于创建它将指向的对象。创建CollisionLayer的对象时会发生这种情况。

定义array []为空的结构不是一个好主意,请参考this。它讲的是C ++,它也应该适用于C语言。

答案 3 :(得分:1)

VLA不能是结构的成员,因此在创建结构对象时需要使用malloc分配内存。