代码之家  ›  专栏  ›  技术社区  ›  umbe1987

预分配数组以伪造大小增加

  •  0
  • umbe1987  · 技术社区  · 6 月前

    我是C语言的新手,我知道一旦创建了数组,我就不能增加它的大小。

    如果我事先知道我的数组将有一个固定的最大大小,我想问一下,简单地创建一个具有此最大大小的数组并仅处理前N个索引(其中N是我感兴趣的初始大小)是否是一个好主意。然后,如果需要,我可以通过(例如)处理前N+Z个索引来“人为”增加我的数组(其中Z表示我的数组需要增长的量)。

    我的目标是存储蛇游戏的坐标,其中每个坐标代表我的蛇在X或Y方向上的一块(为此需要两个数组)。 我也知道我应该用指针访问数组。这对我来说合理吗?

    2 回复  |  直到 6 月前
        1
  •  3
  •   John Bollinger    6 月前

    如果我事先知道我的数组将有一个固定的最大大小,我想问一下,简单地创建一个具有此最大大小的数组并仅处理前N个索引(其中N是我感兴趣的初始大小)是否是一个好主意。然后,如果需要,我可以通过(例如)处理前N+Z个索引来“人为”增加我的数组(其中Z表示我的数组需要增长的量)。

    是的,一般来说,当你对所需的空间量有一个已知的上限时,这是一个完全可行的替代方案。

    如果你的上限非常大,那么就会有警告,但我预计像你这样的游戏不会有那么大的需求。

    我的目标是存储蛇游戏的坐标,其中每个坐标代表我的蛇在X或Y方向上的一块(为此需要两个数组)。

    这种特殊的安排似乎很奇怪。对于坐标列表,我倾向于使用 n x 2(2D)阵列。但同样的一般考虑也适用。

    我也知道我应该用指针访问数组。

    在C中,你 无法避免 通过指针访问数组,但大多数操作不需要您对此进行明确说明。

    这对我来说合理吗?

    总的来说,是的,从你给出的细节来看,你所描述的似乎是合理的。

        2
  •  0
  •   0___________    6 月前

    而不是使用硬编码 arrays 使用动态内存分配:

    int *myArray = malloc(N * sizeof(*myArray);
    if(myArray) 
    {
         /* now you can use the memory*/
    }
    

    然后,您可以将分配的内存用作数组:

    myArray[5] = 100;
    

    当您需要更多内存调用时 realloc

    int *tmp;
    tmp = realloc(myArray, (N + Z) * sizeof(*myArray));
    if(tmp) 
    {
        myArray = tmp;
        /* you have new size of your array - old data is preserved if new size is larger than old */
    }
    

    当你真的需要它的时候 free

    free(myArray);