【问题标题】:How can I change the size of an array in C?如何在 C 中更改数组的大小?
【发布时间】:2021-10-19 19:50:15
【问题描述】:

我正在对gamestudio 进行一些试验。 我现在正在做一个射击游戏。 我有一个指向敌人的数组。当敌人被杀死时,我想将他从列表中删除。而且我还希望能够创造新的敌人。

Gamestudio 使用名为 lite-C 的脚本语言。它具有与 C 相同的语法,并且在他们所说的网站上,它可以使用任何 C 编译器进行编译。它是纯 C,没有 C++ 或其他任何东西。

我是 C 新手。我通常使用 .NET 语言和一些脚本语言进行编程。

【问题讨论】:

    标签: c arrays resize size arraylist


    【解决方案1】:

    一旦在 C 中创建了一个数组,它就会被设置。您需要一个动态数据结构,例如 Linked List 或 ArrayList

    【讨论】:

      【解决方案2】:

      查看realloc,它允许您调整给定指针指向的内存大小(在 C 中,数组是指针)。

      【讨论】:

      • 我相信这个数组必须是由 malloc 分配的数组,而不是在堆栈上。并且还要注意,如果它未能就地分配,它将释放旧块并分配一个新块。这会使指向原始块的任何指针无效。
      • 啊,是的。如果你要使用 realloc,这两个都需要考虑。
      • 数组不是指针。数组在传递给函数时会衰减为指针。数组和指针是两种截然不同的东西。
      【解决方案3】:

      数组是静态的,所以你不能改变它的大小。你需要创建链表数据结构。该列表可以根据需要增长和缩小。

      【讨论】:

        【解决方案4】:

        正如 NickTFried 所建议的,链表是一种方法。 另一种方法是有一张足够大的桌子来容纳您将拥有的最大数量的项目并管理它(哪些是有效的或无效的,当前列表中有多少敌人)。

        就调整大小而言,您必须使用指针而不是表格,并且您可以重新分配、复制等等……这绝对不是您想在游戏中做的事情。

        如果性能是一个问题(我猜是),那么我可能会使用正确分配的表。

        【讨论】:

        • 它仍然是一个列表的数组实现。不过你是对的,它需要了解最大数组大小。
        【解决方案5】:

        你不能。这通常通过动态内存分配来完成。

        // Like "ENEMY enemies[100]", but from the heap
        ENEMY* enemies = malloc(100 * sizeof(ENEMY));
        if (!enemies) { error handling }
        
        // You can index pointers just like arrays.
        enemies[0] = CreateEnemy();
        
        // Make the array bigger
        ENEMY* more_enemies = realloc(enemies, 200 * sizeof(ENEMY));
        if (!more_enemies) { error handling }
        enemies = more_enemies;
        
        // Clean up when you're done.
        free(enemies);
        

        【讨论】:

        • x = realloc(x, ...) 是等待发生的内存泄漏。 (但是,我意识到演示如何处理动态分配失败并不是这个答案的重点。)
        • 是的,我应该检查一下malloc 是否也返回NULL
        • 答案已编辑(等待同行评审)以进行正确的错误检查,因为它已被用作复制目标和大约 24k 视图。
        【解决方案6】:

        我想减小数组大小,但效果不佳:

        myArray = new int[10];//Or so.
        

        所以我尝试创建一个新的,其大小基于保存的计数。

        int count = 0;
        
        for (int i = 0; i < sizeof(array1)/sizeof(array1[0]); i++){
          if (array1[i] > 0) count++;
        }
        
        int positives[count];
        

        然后重新传递第一个数组中的元素以将它们添加到新数组中。

        //Create the new array element reference.
        
        int x = 0;
        
        for (int i = 0; i < sizeof(array1)/sizeof(array1[0]); i++){
          if (array1[i] > 0){ positives[x] = array1[i]; x++; }
        }
        

        这里我们有一个全新的数组,其中包含我们想要的确切数量的元素(在我的例子中)。

        【讨论】:

          猜你喜欢
          • 2017-07-03
          • 1970-01-01
          • 2011-01-28
          • 2016-05-12
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          相关资源
          最近更新 更多