【问题标题】:How make a dynamic array using void** and void*?如何使用 void** 和 void* 制作动态数组?
【发布时间】:2015-11-20 00:56:50
【问题描述】:

我想创建一个动态内存数组函数,我可以在参数中放入我想要的任何类型、计数和我想要的项目。我一直在谷歌搜索和查看 YT 视频,但没有一个解释如何做到这一点,以及我想要的项目何时是指针。例如,我会这样:

struct Entity
{
   int health;
   int level;
   int experience;
   char* name;
}

Entity** entitylist = NULL;
int entitycount = 0;

Entity* CreateEntity(/*args for creating an entity*/)
{
   Entity* newentity = malloc(sizeof(Entity));
   // All of the entity creation stuff and at the end...
   AddItemToList(&Entity, &newentity, &entitycount);
}

我知道在我要创建的函数中我需要传递对特定列表的引用,但我对此一无所知。我尝试使用 malloc 和 realloc 但要么使程序崩溃,要么什么也不做。 new 和 delete 对这类东西有用吗?

如何删除这样的东西?我还没有在互联网上看到任何关于从列表中删除项目,仅添加它们的信息。

谢谢!

【问题讨论】:

  • 您使用的是 C 还是 C++?它们是非常不同的语言,在这类事情上有着非常不同的最佳实践。
  • 是的,选择一种语言,人们可能会指向十几个库。
  • C++ 抱歉。虽然我对 C 的东西也很好。
  • 那我不能用指针怎么办?
  • 在 C++ 中使用malloc 绝对没有错。

标签: c++ arrays memory dynamic


【解决方案1】:

int** 等数据类型使用双指针可以为您提供动态二维数组或指针对象的动态数组,具体取决于您的实现,而单个int* 只是一个普通的动态数组。要完全实例化并为它们分配内存,您可以这样做:

一维动态数组:

int* arr;
arr = new int[SIZE];

二维动态阵列:

int** arr;
arr = new int*[SIZE]; //<- stop here for 1D array of pointer objects
for (int i = 0; i < SIZE; i++)
    arr[i] = new int[SIZE2];

【讨论】:

  • 谢谢。但是我如何从数组中删除一些东西。我会遍历它并删除所有指针吗?
  • @CNJMC1 如果您只是尝试重置或更改其中的值,如果您知道确切的索引并设置为 NULL 以“清空”索引,则可以迭代或调用赋值。如果您要调用 delete,您将从内存中删除指针本身,这可能会在将来迭代时导致分段错误,直到您使用新指针重新实例化该位置
  • 我将如何使二维动态数组适用于所有数据类型,甚至是我自己的一些数据类型?
  • @CNJMC1 这个概念对于所有数据类型都是一样的,包括自制的类,只要把int改成你的类或者想要的数据类型。例如,对于一个名为 Car 的个人课程,要创建一个包含 Car 实例的二维数组,您可以... Car** cars; cars = new Car*[SIZE]; etc.。如果您说的是支持所有数据类型的动态数组,恐怕根本不存在,每个数组只能保存一种数据类型的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2014-10-27
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多