获取3D char * Array的大小

时间:2017-07-27 16:37:07

标签: c++ arrays

我正在尝试创建一个包含武器及其附件的多维数组: 我有很多像这样的数组:

char *G18[19] = { "glock_mp", "glock_akimbo_mp", "glock_eotech_mp", "glock_fmj_mp", "glock_reflex_mp", "glock_silencer_mp", "glock_xmags_mp", "glock_akimbo_fmj_mp", "glock_akimbo_silencer_mp", "glock_akimbo_xmags_mp", "glock_eotech_fmj_mp",
        "glock_eotech_silencer_mp", "glock_eotech_xmags_mp", "glock_fmj_reflex_mp", "glock_fmj_silencer_mp", "glock_fmj_xmags_mp", "glock_reflex_silencer_mp", "glock_reflex_xmags_mp", "glock_silencer_xmags_mp" };

但是所有武器都不属于同一类别,例如。 AK47是突击步枪,这个G18是机枪。所以我创建了2D阵列,它重新定义了一个类别,如下所示:

char **MACHINEGUNS[4] = { G18, TMP, RAFFICA, PP2000 };

所以现在我已经将武器排序了,我创建了另一个应该保存类别的数组,如下所示:

char ***WEAPONS[7] = { ASSAULTRIFLES, SUBMACHINEGUNS, LIGHTMACHINEGUNS, SNIPERS, PISTOLS, MACHINEGUNS, SHOTGUNS };

访问像

这样的武器
char *weapon = WEAPONS[assaultrifle][ak47][0]; // assaultrifle & ak47 are enum mebers

完美无缺。我面临的问题是我无法获得行和列大小。 F.E.如果我想知道他们会做多少武器类别:

sizeof(WEAPONS)

这给了我7.如果我想知道我有多少个assaultrifles:

sizeof(WEAPONS[assaultrifles])

但问题是:这给了我4虽然assaultrifle的阵列大小是9:

char **ASSAULTRIFLES[9] = { AK47, M16A4, M4A1, FN2000, ACR, FAMAS, FAL, SCARH, TAR21 };

如果我这样做,它会返回4:

sizeof(WEAPONS[assaultrifles][ak47])

即使ak47的阵列大小为39.任何想法为什么它不起作用以及我如何实现这一目标?提前致谢,对于长篇文章感到抱歉!

1 个答案:

答案 0 :(得分:2)

在C或C ++中,没有在运行时“获取数组大小”这样的东西。您可以使用[<size>]获取数组的大小(使用sizeof声明),因为它的大小在编译时是已知的。当你获得sizeof一个指针时,你实际上得到一个指针需要多少字节,这就是你得到4的原因。如果你想在运行时知道一个向量的大小,典型的选项是:

  • 一般使用std::vectorSTL containers。有一百万个教程和示例,你可以检查一下。
  • 不是存储原始数组(或指向数组的指针),而是存储包含指向数组和大小的指针的简单structclass es。这有点像滚动自己的,有限的std::vector,你必须小心在必要时正确释放内存等等,所以我不确定这是一个很好的选择。
  • 其他一些肮脏的C类技巧,比如在每个数组的末尾添加NULL / nullptr,然后遍历整个事物,直到每次需要查找大小时到达它。效率低,容易出错。

所以,是的,简而言之,请使用std::vector或其他容器。