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

时间:2016-05-06 11:26:25

标签: c++ arrays pointers

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

#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-loop并再次运行它时,数字就会消失。

有人可以解释为什么会这样吗?如果需要,代码将在64位Linux机器中编译。

4 个答案:

答案 0 :(得分:3)

你很幸运,循环停止了;你本可以把你整个社区炸掉!

你的循环期望找到一个“零”来终止数组迭代,但你的数组没有。因此,你的循环将继续递增超过数组的末尾,直到上帝知道什么。实际结果取决于太多的实际因素,无论是可预测的还是有用的解释。

我认为这是一个练习,因为使用“null-termination”迭代int数组是非常奇怪的。实际上你只需写:

for (auto x : ar)
    std::cout << x << '\n';
}

答案 1 :(得分:2)

您正在调用undefined behavior

第一个for循环终止条件为*p。所以它试图访问内存超过ar实际拥有的内存。然后运行循环,直到它在终止之前找到包含0(读取false)的内存位置。在你的情况下,它只运行一次(幸运的是你!)。在我结束时,它在终止之前再运行了四次。

您必须循环的次数与数组的大小一样多,即sizeof(ar)/sizeof(ar[0])

答案 2 :(得分:0)

确保您已终止零:

int ar[] = {1,1,2,3,5,8,13,21,34,55, 0};

答案 3 :(得分:0)

嗯,实际上这会导致不同机器或不同条件下的结果不同。导致这种情况的是您的陈述

for (int * p = ar; *p; p++)
{
    std::cout << *p << std::endl;
}

在这里,您使用*p作为for循环继续运行的条件。众所周知,C ++对待数字&gt; 0表示true,0表示false。在for语句中,如果该地址中的值为零(True或False),程序将检查下一个内存地址。如您所知,特定PC上此特定情况下的下一个地址的值为4196368.因此for循环一直持续到下一个地址的值为零。你可以通过打印地址来看到这一点。

for (int * p = ar; *p; p++)
{
    std::cout << *p << " " << p << std::endl;
}

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