我的结构声明:
struct tileStruct
{
SDL_Rect * tilePixel;
Uint32 * tpColor;
int * tileNum;
int * xCoord;
int * yCoord;
};
这是我的函数,需要初始化一个tileStructs数组,但该结构的每个成员都在堆上。
void tileInit()
{
struct tileStruct * tileArr = (struct tileStruct *)malloc(NUM_TILES_IN_WINDOW * sizeof(struct tileStruct));
tileArr->tilePixel = (SDL_Rect *) malloc(tPIXELS_PER_TILE * sizeof(SDL_Rect));
tileArr->tpColor = (Uint32 *) malloc(tPIXELS_PER_TILE * sizeof(Uint32));
tileArr->xCoord = (int *) malloc(sizeof(int));
tileArr->yCoord = (int *) malloc(sizeof(int));
tileArr->tileNum = (int *) malloc(sizeof(int));
//rest of function
}
所以,我的问题是,我需要这样做吗?
struct tileStruct * tileArr = (struct tileStruct *)malloc(NUM_TILES_IN_WINDOW * sizeof(struct tileStruct));
for(int i = 0; i < NUM_TILES_IN_WINDOW; i++)
{
tileArr[i].tilePixel = (SDL_Rect *) malloc(tPIXELS_PER_TILE * sizeof(SDL_Rect));
tileArr[i].tpColor = (Uint32 *) malloc(tPIXELS_PER_TILE * sizeof(Uint32));
tileArr[i].xCoord = (int *) malloc(sizeof(int));
tileArr[i].yCoord = (int *) malloc(sizeof(int));
tileArr[i].tileNum = (int *) malloc(sizeof(int));
}
最佳答案
是的,你应该使用循环。由于您已经分配了包含 NUM_TILES_IN_WINDOW
元素的 structtileStruct
数组,因此您需要迭代所有元素。并且您之前的 tileInit()
仅初始化第一个元素。
也许用下面的方式重新定义你的类型会更好:
struct tileStruct
{
SDL_Rect tilePixel[tPIXELS_PER_TILE];
Uint32 tpColor[tPIXELS_PER_TILE];
int tileNum;
int xCoord;
int yCoord;
};
通过这样的定义,您可以避免一堆辅助分配。 (当然,只有当structtileStruct
对其每个元素都有逻辑所有权时,这种方式才是可接受的。)
关于c - 是否需要一个循环来将结构数组的每个成员设置在堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37914401/