c++ - 循环遍历 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;
}
}
我相信有更好的方法来遍历这个数组并避免错误。预先感谢您的帮助。
解决方案
初始化你的数组:
std::array<char*, 10> m_arr{}; // nullptr initialized
那么您可以检查非 nullptr 值的安全性:
for (auto ptr : m_arr) {
if (ptr) std::cout << ptr << std::endl;
}
推荐阅读
- uwp - 如何处理错误“MDM 2009 Duplicate type found processing metadate file”?
- aws-amplify - 在设置 Amplify 项目时(通过 amplify init),为什么编辑器很重要?
- javascript - 循环一个javascript对象数组(在另一个对象内)
- java - 在 JasperSoft 7.1.1 设备中创建新的 PostgreSQL 数据源时出现问题
- python - 我的控制台没有输出任何信息?
- ios - 如果我的 20 个应用程序使用相同的框架,但每个应用程序的内容(故事)不同,是否会违反任何 Apple Store 规则?
- javascript - 我的轮播“下一步”按钮不起作用,我的轮播没有自动转换
- splunk - Splunk:发生此错误时需要帮助使用事务来获取 pcode
- xpath - 如果可用,则将嵌套兄弟中的文本与父节点中的文本连接起来
- google-apps-script - 有没有办法通过脚本编辑器动态引用 google sheet 脚本中的单元格以在另一个单元格上创建注释?