使用指针遍历数组

新手上路,请多包涵

以下 C++ 程序打印的输出比我预期的要多。谁能解释为什么会这样?该程序尝试使用指针循环遍历整数数组,沿途打印每个值。

 #include <cstdio>
using namespace std;

int main(int argc, char **argv) {
    puts("hi");
    int ia[5] = {1,2,3,4,5};
    for (int *p = ia; *p; ++p) {
        printf("Char is: %d\n", *p);
    }
    return 0;
}

/*
 hi
 Char is: 1
 Char is: 2
 Char is: 3
 Char is: 4
 Char is: 5
 Char is: 32767
 Char is: -811990796
 Char is: -133728064
 Char is: 1606416320
 Char is: 32767
 Char is: -1052593579
 Char is: 32767
 Program ended with exit code: 0
*/

原文由 none 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 592
2 个回答

您需要有一个 0/NULL 值才能停止,目前您不需要。

您的循环条件将允许迭代,直到您获得一个评估为假的值(即 0)并且您的数组不包含该值,因此您的迭代将继续超出数组的边界,并且在访问某些内存时将在某个点退出它不应该。

有几种方法可以修复它。您可以将 0 添加到数组的末尾。

 #include <cstdio>
using namespace std;

int main(int argc, char **argv) {
    puts("hi");
    int ia[] = {1,2,3,4,5, 0};
    for (int *p = ia; *p; ++p) {
        printf("Char is: %d\n", *p);
    }
    return 0;
}

这个问题是你现在不能在你的数组中使用 0 ,否则它会提前终止。

给定数组长度,更好的方法是预先计算停止的地址。该地址是数组末尾的一个地址。

 #include <cstdio>
using namespace std;

int main(int argc, char **argv) {
    puts("hi");
    int ia[] = {1,2,3,4,5};
    int* end = ia + 5;
    for (int *p = ia; p != end; ++p) {
        printf("Char is: %d\n", *p);
    }
    return 0;
}

现在我们正在研究标准库迭代器使用的方法。现在模板可以推断出数组的大小。

IE

 #include <iterator>
...

for (auto it = std::begin(ia); it != std::end(ia); ++it) {
    printf("Char is: %d\n", *it);
}

...

最后,基于范围的 for 也支持数组。

 for (auto i: ia)
{
    /* do something */
}

原文由 Paul Rooney 发布,翻译遵循 CC BY-SA 4.0 许可协议

谁能解释为什么会这样?

您正在越界访问数组。您的程序具有未定义的行为。

线

int ia[5] = {1,2,3,4,5};

创建一个恰好包含 5 个元素的数组。在访问数组的最后一个元素之后访问 *p 并不好。

您可以使用:

 for (int *p = ia; p != std::end(ia); ++p) {

以确保您不会越界访问数组。

您将需要添加:

 #include <iterator>

使用 std::end

原文由 R Sahu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏