在C++中循环遍历数组时的额外数字

Extra number while looping through an array in C++

本文关键字:数字 数组 C++ 循环 遍历      更新时间:2023-10-16

我正试图使用以下代码使用指针循环遍历整数数组:

#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;
}

您将知道,您的代码检查下一个地址以查看其值,如果它确实不为零,它将继续循环。