,c++,pointers,stdarray"/>

首页 > 解决方案 > 循环遍历 std::array 的正确方法

问题描述

考虑以下指向 char 的 std::array 指针:

std::array<char*, 10> m_arr;

我知道我可以使用以下代码循环遍历数组

for(size_t i {0}; i < m_arr.size(); i++) {
            std::cout << m_arr.at(i) << std::endl;
    }

但是,当未正确分配第 i 个元素时,此方法会引发“访问冲突读取位置”异常。例如,以下代码分配了前两个元素,但第三个元素m_arr.at(3), 引发了上述错误:

    // test variables
    int x {100};
    double y {3.14};
    int* x_ptr {&x};
    double* y_ptr {&y};

    // std::array of pointer to char
    std::array<char*, 10> m_arr;

    // set the first two elements of m_arr
    char buf1[16];
    sprintf_s(buf1, "%p", x_ptr);
    m_arr.at(0) = buf1;
    char buf2[16];
    sprintf_s(buf2, "%p", y_ptr);
    m_arr.at(1) = buf2;

    for(size_t i {0}; i < m_arr.size(); i++) {
            std::cout << m_arr.at(i) << std::endl;
    }

我通过使用数组的最后一个元素检查第 i 个元素以跳过未分配的元素,找到了解决此问题的快速解决方案,但显然这不是一个干净的答案

for(size_t i {0}; i < m_arr.size(); i++) {
        if(m_arr.at(i) != m_arr.back()) {
            std::cout << m_arr.at(i) << std::endl;
        }
    }

我相信有更好的方法来遍历这个数组并避免错误。预先感谢您的帮助。

标签: c++pointersstdarray

解决方案


初始化你的数组:

std::array<char*, 10> m_arr{}; // nullptr initialized

那么您可以检查非 nullptr 值的安全性:

for (auto ptr : m_arr) {
    if (ptr) std::cout << ptr << std::endl;
}

推荐阅读