我刚刚开始学习C ++,所以我相当肯定答案可能很简单。作为测试,我只是设置一个数组,然后想要通过循环打印出阵列。
我的代码如下。它按预期打印出我的数组,但随后打印出一堆其他数字。这些数字是什么?它们来自哪里?我怀疑' sizeof'不是最好用的。我发现的所有例子都比我需要的更复杂。无论如何,我有兴趣了解额外的数字。有任何见解吗?
int age[4];
age[0]=23;
age[1]=34;
age[2]=65;
age[3]=74;
for (int i = 0; i <= sizeof(age); i++)
cout << age[i] << endl;
return 0;
...输出:
23
34
65
74
4
2147307520
0
2293608
4198582
1
3084992
3085608
-1
2293592
1980179637
-725187705
-2
答案 0 :(得分:4)
sizeof
给出 bytes 中对象的大小。如果数组元素大于一个字节(通常为int
),则该数字将大于数组大小。
获取数组中元素数量的一种方法是除以元素的大小:
for (size_t i = 0; i < sizeof(age)/sizeof(age[0]); i++)
std::cout << age[i] << '\n';
(请注意,您还需要<
而不是<=
,否则您仍然会离开结束。
另一种方法是将对数组的引用传递给函数模板,为数组大小实例化:
template <typename T, size_t size>
void print(T (&array)[size])
{
for (size_t i = 0; i < size; ++i)
std::cout << array[i] << '\n';
}
print(age);
另一种方法是使用std::vector
或std::array
而不是普通数组:
std::array<int, 4> age;
age[0]=23;
age[1]=34;
age[2]=65;
age[3]=74;
for (size_t i = 0; i < age.size(); ++i)
std::cout << age[i] << '\n';
答案 1 :(得分:2)
sizeof(age) == sizeof(int) * number_of_elements ==>
number_of_elements = sizeof(age) / sizeof(int)
然后您的代码变为:
for (int i = 0; i < sizeof(age)/sizeof(age[0]); ++i)
cout << age[i] << endl;
在C ++中,您可以编写一个函数来为您计算大小(不适用于动态数组):
template <class T, std::size_t size>
std::size_t array_size( T(&arr)[size] )
{
return size;
}
如果你要使用C ++ 11,你可以选择for-each循环:
for(int element : age){
....
}
此外,std :: begin和std :: end的自由函数形式可以完成这项工作:
for(auto b = std::begin(age); b != std::end(age); ++b){
....
}
答案 2 :(得分:0)
因为i < 4
在32位机器上是16,所以应该是sizeof(age)
。
答案 3 :(得分:0)
sizeof(age)
是age
的字节数,而不是元素数。
除以age
元素的大小,得到它:
for (int i = 0; i < sizeof(age) / sizeof(*age); i++)
cout << age[i] << endl;
注意:对于动态数组,您必须单独存储数组的大小:
std::size_t size = 4; // size_t corresponds to maximum size an array can hold
int* age = new int[size];
for (int i = 0; i < size; i++)
cout << age[i] << endl;
其他数字是数组末尾的垃圾。
age[10]
是未定义的行为,基本上是垃圾数字。
答案 4 :(得分:0)
sizeof是年龄数组是16字节I.e. Sizeof(int)* 4.您需要数组长度。
答案 5 :(得分:0)
由于sizeof(age)返回16,因此您有4个值加上12个值,其值来自阵列后面的内存。这些内存段中的值是随机的,具体取决于您在启动程序之前存储的内容。如果您使用了内存检查工具,则会出现错误,因为可能没有为您的程序分配此内存。
正如其他人所说,您应该将数组中确切的元素数作为附加变量。
const int COUNT = 4;
int age[COUNT];
age[0]=23; age[1]=34; age[2]=65; age[3]=74;
for (int i = 0; i < COUNT; ++i)
{
cout << age[i] << endl;
}