大于C ++中指定大小的数组

时间:2018-09-04 03:15:59

标签: c++ arrays

在测试这样的数组时:

float test [3] = {1, 2, 3};

cout << "Test size: " << sizeof(test) << endl;

print语句显示的大小为12。同样,当我将大小设为12时,数组中的元素数为47。这不是在C ++中指定数组大小的正确方法吗?

6 个答案:

答案 0 :(得分:8)

sizeof不返回数组中的元素数,而是返回以字节为单位的内存大小。由于您的数组包含三个常规整数,并且整数的大小为4个字节,因此3 * 4 == 12个字节。

要获取数组的 length ,您有几个选择:


选项1

int size = sizeof(test) / sizeof(test[0]);

执行的操作是获取数组的大小(12个字节),然后将其除以单个元素的大小(4个字节)。显然是12/4 == 3。


选项2

正如@PaulMcKenzie指出的那样,如果您能够使用C ++ 17,则可以使用std::size。这很容易,因为您可以执行以下操作:

int size = std::size(test);

选项3(不推荐)

int size = *(&test + 1) - test;

here解释说,这是使用指针的聪明技巧。将导致不确定的行为,并可能会中断,具体取决于编译器及其优化。

答案 1 :(得分:7)

如果您想更有效地计算数组中元素的数量,可以使用模板。

template<typename T, std::size_t Size>
std::size_t GetArrLength(T(&)[Size]) { return Size; }

如果我们这样称呼它:

float test[3] = {1,2,3};
GetArrLength(test);

编译器将尝试推断模板参数。为了使参数类型与您要传递的参数匹配,T必须为浮点数,大小必须为3(使参数成为3个浮点数数组的引用)。

答案 2 :(得分:3)

您必须使用以下方法来获取所需阵列的实际大小。

 int size = sizeof(test)/sizeof(test[0]);

sizeof()实际上是returns no. of bytes。所以,你得到了。数组对象中的字节数。实际得到的不是。元素,我们需要将其除以其中元素的大小。例如,这里sizeof(float)

答案 3 :(得分:0)

您需要将单个元素的大小相除以获得数组大小。

int sz = sizeof(test) / sizeof(test[0]);
cout << "test size: " << sz << endl;

答案 4 :(得分:0)

这将起作用:

size_t n = sizeof(test)/sizeof(test[0]);

size _ t是保证类型,可以保存任何数组索引,因此请使用size_t

答案 5 :(得分:0)

为此,标准库具有类型特征。

BotChat.App({
        bot: bot,
        locale: params['locale'],
        resize: 'detect',
        // sendTyping: true,    // defaults to false. set to true to send 'typing' activities to bot (and other users) when user is typing
        speechOptions: speechOptions,
        user: user,
        directLine: {
          domain: params['domain'],
          secret: params['s'],
          token: params['t'],
          webSocket: params['webSocket'] && params['webSocket'] === 'true' // defaults to true
        }
      }, document.getElementById('chatBot'));