静态数组的大小

时间:2009-01-17 10:25:19

标签: c++ arrays size

我声明了一个静态字符数组,然后将它传递给一个函数。怎么得到没有。函数内部数组中的字节数?

7 个答案:

答案 0 :(得分:33)

使用具有非类型模板参数的函数模板:

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

致电:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

此函数的新副本将针对调用它的每个不同大小的数组进行实例化,因此如果使用许多不同大小的数组调用它,您将获得一些代码膨胀。但情况可能并非如此。

答案 1 :(得分:14)

您必须将其传递给该函数。您可以使用sizeof()来获取数组的大小。

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

这个MSDN page更多地解释了sizeof,并有一个更大的例子。

编辑:* see j_random_hacker's answer了解使用模板的有趣技巧...... *

答案 2 :(得分:3)

没有。不要使用数组。请改用矢量。这些天几乎没有理由使用数组,因为它们不安全。 AFAIK,它们是软件问题的主要原因之一,因为很容易意外地超出阵列的末尾。

使用向量,您不必再担心缓冲区溢出。而且你的功能可以很容易地找出vecor的大小。

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}

答案 3 :(得分:2)

int array_size = sizeof(Array)/ sizeof(Array [0]);

答案 4 :(得分:2)

您还可以在C ++ 17中使用std::size()

https://en.cppreference.com/w/cpp/iterator/size

#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}

对于c ++ 17之前的副本示例实现;)

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}

答案 5 :(得分:0)

你做不到。 C ++中的数组是指针,这就是你所拥有的:指向数组开头的指针。如果它恰好是一个字符串,您可以使用strlen来测量它的长度。如果是其他已知格式,您可以根据该格式计算长度。

考虑以下代码:

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

无论你的函数参数是char []还是char *,你都不知道它的大小。

我建议将大小作为单独的参数传递。

答案 6 :(得分:0)

另一个选项是创建一个管理字符串的字符串类。我相信那里的人已经做到了。最原始的版本是带有char *和缓冲区长度的结构,您必须在每次更改时手动管理大小。频谱的另一端是完全实现的字符串类,具有运算符重载和管理功能。

然后将此类传递给您的函数,它已知道大小。然后将它作为单独的参数传递并没有任何不同;如果它们的长度不同,它只是一种管理字符串的简单方法。