在C++中循环遍历数组时的额外数字
Extra number while looping through an array in C++
我正试图使用以下代码使用指针循环遍历整数数组:
#include <iostream>
int main (int argc, char ** argv)
{
int ar[] = {1,1,2,3,5,8,13,21,34,55};
char s[] = "string";
std::cout << "Print fibonacci until ten using pointers" << std::endl;
for (int * p = ar; *p; p++)
{
std::cout << *p << std::endl;
}
// for (char * cp = s; *cp; cp++)
// std::cout << "char is " << *cp << std::endl;
return 0;
}
在运行此代码时,我得到了所有10个元素加上一个数字4196368。但当取消第二个for循环的注释并再次运行时,数字就会消失。
有人能解释为什么会发生这种情况吗?如果需要,代码将在64位Linux中编译。
幸运的是,循环完全停止了;你可以炸掉你的整个街区!
循环期望找到一个"零"来终止数组迭代,但数组没有。因此,您的循环将一直递增到数组的末尾,直到天知道发生了什么。实际结果取决于太多的实际因素,无法预测或有效解释。
我认为这是一个练习,因为使用"null终止"来迭代int
数组是非常特殊的。事实上,你只需要写:
for (auto x : ar)
std::cout << x << 'n';
}
您正在调用一个未定义的行为。
第一个for
循环的终止条件是*p
。因此,它试图访问ar
实际拥有的内存。然后运行循环,直到找到包含0的内存位置(读取false
),然后终止。在你的情况下,它只多跑了一次(你很幸运!)。在我的一端,它又跑了四次才终止。
循环次数必须仅与数组大小相同,即sizeof(ar)/sizeof(ar[0])
确保已终止零:
int ar[] = {1,1,2,3,5,8,13,21,34,55, 0};
实际上,这将在不同的机器或不同的条件下产生不同的结果。导致这种情况的原因是您的for statement
for (int * p = ar; *p; p++)
{
std::cout << *p << std::endl;
}
在这里,您使用*p
作为for循环继续运行的条件。如我们所知,C++将数字>0视为true
,将0视为false
。在for语句中,如果下一个内存地址中的值是否为零(True或False),程序将检查该地址。正如你所知,在这种特殊情况下,你的电脑上的下一个地址的值是4196368。所以for循环一直持续到下一个地址的值为零。你可以通过打印地址来看到这一点。
for (int * p = ar; *p; p++)
{
std::cout << *p << " " << p << std::endl;
}
您将知道,您的代码检查下一个地址以查看其值,如果它确实不为零,它将继续循环。
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 数组/c++中的大量数字
- 遍历并行数组以确定C++中的最大数字
- 整数区间(或 int 数组)中每个数字的出现次数
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 获取 2D 数组 c++ 中的所有数字对
- 为什么使用数组元素查找最大数字的程序不起作用?
- 如何从向量或数组中选择最常见的数字?(前五名)C++
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 以十为基数的数字到布尔数组,该数组要求二进制/基数为 2 的数字
- C++ 检查结果数组中有多少次数字
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何在C++中有效地将数字值重新分配给字符数组
- 查找数组中的最小数字
- 查找数组中重复(重复)数字的索引
- 我必须找到给定数组中所有数字的周期,就像有很多解决方案,但数组的大小是 10^5
- 类、数字/数组或对象中的对象