我试图使用以下代码使用指针遍历整数数组:
#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机器中编译。
答案 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;
}
你会在这里知道你的代码检查下一个地址以查看它的值,如果它确实不为零,它将继续循环。