C ++我的数组/循环有什么问题?

时间:2011-11-24 23:23:42

标签: c++

我刚刚开始学习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

6 个答案:

答案 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::vectorstd::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;
}