【发布时间】:2018-06-29 16:31:37
【问题描述】:
我在 C 中工作。
我有一个名为 Entity 的简单结构
typedef struct Entity
{
int x, y;
int velX, velY;
}Entity;
我正在创建一个 Entity 类型和大小为 1 的动态数组。然后我使用 addEntity 函数添加一个元素
void addEntity(Entity** array, int sizeOfArray)
{
Entity* temp = malloc((sizeOfArray + 1) * sizeof(Entity));
memmove(temp, *array, (sizeOfArray)*sizeof(Entity));
free (*array);
*array = temp;
}
然后我使用另一个函数来改变这两个元素的值:
int main()
{
Entity* entities = malloc(sizeof(Entity)); // dynamic array of size 1
addEntity(&entities, 1); // add one element
changeValue(&entities[0], 10); // change the values of the first two elemebts
changeValue(&entities[1], 20);
printf("%d\n", entities[0].x); // print the values
printf("%d", entities[1].x);
free(entities); // free the memory
return 0;
}
void changeValue(Entity* entity, int nb)
{
entity->x = nb;
}
结果是 10 和 20,一切正常。现在,如果我改用这种语法
int main()
{
Entity* entities = malloc(sizeof(Entity)); // dynamic array of size 1
addEntityAndSetValues(entities);
printf("%d\n", entities[0].x); // print the values
printf("%d", entities[1].x);
free(entities); // free the memory
return 0;
}
void addEntityAndSetValues(Entity* entities)
{
addEntity(&entities, 1);
changeValue(&entities[0], 10);
changeValue(&entities[1], 20);
}
我得到的不是 10 和 20,而是一些随机数。我真的不明白为什么。
【问题讨论】:
-
请注意,
realloc()函数会增长一个数组(因此您不必像在addEntity()中那样将旧的复制到新的副本中)。另请注意,当您不断移动数据时,一次增长一个元素会导致二次(缓慢)行为。分配一些空数组元素并使用额外的元素;当没有空闲时,将分配的数量加倍。其他策略是可能的,但一次一个是不好的。 (如果数组中只有两个实体,这当然无关紧要。但首先你不需要动态分配。)
标签: c arrays pointers struct dynamic-allocation