在测试这样的数组时:
float test [3] = {1, 2, 3};
cout << "Test size: " << sizeof(test) << endl;
print语句显示的大小为12
。同样,当我将大小设为12
时,数组中的元素数为47
。这不是在C ++中指定数组大小的正确方法吗?
答案 0 :(得分:8)
sizeof
不返回数组中的元素数,而是返回以字节为单位的内存大小。由于您的数组包含三个常规整数,并且整数的大小为4个字节,因此3 * 4 == 12个字节。
要获取数组的 length ,您有几个选择:
int size = sizeof(test) / sizeof(test[0]);
执行的操作是获取数组的大小(12个字节),然后将其除以单个元素的大小(4个字节)。显然是12/4 == 3。
正如@PaulMcKenzie指出的那样,如果您能够使用C ++ 17,则可以使用std::size。这很容易,因为您可以执行以下操作:
int size = std::size(test);
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'));