如何获取指针数组中元素的数量?

3
如何获取指针数组中元素的数量?
以下是我的代码:
struct mystruct     
{    
  int a;    
  char ch[10];    
  int c;    
};

mystruct *m_arr[2];

我正在其他文件中遍历这个数组。我不想在每个文件中硬编码为2,而是想通过编程获取数组元素的数量。

6
你正在使用C++编程,所以请使用std::vector - rustyx
2
或者如果大小确实固定,可以使用 std::array<mystruct,2>。无论如何,请选择一种语言。您在这里使用了C和C++的混合。 - MSalters
std::begin和std::end也适用于数组。 - Andrew Kashpur
@AndrewKashpur:extern mystruct *m_arr[] 不起作用。这个问题只包含了 m_arr 的定义,但是只有一个翻译单元包含了定义。其余的代码都涉及声明。 - MSalters
7个回答

8
不要使用原始数组。请使用标准容器,例如std::vectorstd::array。这两个容器都有.size()成员,并允许使用基于范围的for循环语法:
    for (mystruct* p : m_arr)

如果你需要 C 兼容性,它们都提供了一个 data() 成员函数,该函数返回底层数组中第一个元素的指针。(在你的情况下,这将是 mystruct **

编辑:原始数组还支持基于范围的循环语法 - 但只有在可见声明包括元素数量时才支持(因此 my_struct * m_arr [2]; 是可以的,但 my_struct * m_arr [] 不起作用)。不可能声明一个没有定义大小的 std::array。其他容器(如std::vector)不包括声明中的大小。


6
通常的做法是:

通常的做法是:

size_t sizeOfArray = sizeof(m_arr)/sizeof(m_arr[0]);

关于 size_t,来自维基百科

size_t 是一种无符号整数类型,用于表示特定实现中任何对象(包括数组)的大小。 sizeof 运算符返回一个 size_t 类型的值。最大的 size_t 大小由 SIZE_MAX 宏常量提供,在头文件(在 C++ 中是 cstdint 头文件)中定义。 size_t 至少保证为 16 位宽。


2
在一些平台上,你可以使用 _countof 宏:size_t sizeOfArray = _countof(m_arr); - Jabberwocky

4
如果这是一个被所有其他源代码文件使用的头文件,其中包含m_arr,则可以使用sizeof(m_arr)/sizeof(m_arr[0])来获取数组中元素的数量。但这真的很危险。如果在某个时刻指针m_arr作为参数进入函数,则函数的范围将不会在sizeof(m_arr)处返回2,而是返回指针在内存中占用的字节数,这可能是8个字节。

因此,如果你想坚持使用普通C语言,那么你必须传递元素数量到单独的变量中。但如果你可以使用C++,那么有各种更好、更安全甚至更快的解决方案。


3
您可以始终执行这样的内存算术运算:
size_t arraySize = sizeof(m_arr) / sizeof(m_arr[0]);

但是如果你没有像什么情况下使用数组而不是向量/字符串?中所述的原因:

那么你应该使用std::array<mystruct*, 2> m_arr;,你可以通过m_arr.size()访问它的大小,并且你可以通过m_arr.data()获取底层本地数组的地址。


1
在C++17中,您可以#include <iterator>并使用std::size(m_arr)

或者您可以自己在C++14中实现它(这不是一个过于复杂的结构)。我不认为它依赖于C++17中的任何核心语言更改。 - StoryTeller - Unslander Monica

1
假设您的数组如下所示:
char *array[3];  

将一个额外的项添加到数组中,该项被视为数组终止符。
char *array[3]={"First element","Second element",""};

其余部分取决于您自己的编程风格,您可以检查终止符并计算除终止字符串外的元素数量。

0

是的,使用std::vector,但如果你一定要...

这适用于c++11或更高版本:

template <typename T, std::size_t N>
constexpr std::size_t sizeofArray(T(&)[N]) {
    return N;
}

最近在一段关于7个你今天可以采用的C++特性的视频中看到了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接