传入结构体指针到函数后,如何迭代元素且避免段错误?
问题原因及解决方法
你遇到的段错误,核心原因是无法通过结构体指针判断C风格数组的结束位置:
当你把数组m传入printSomething时,它退化为指向第一个元素的指针。xd++会不断移动指针,当遍历完2个元素后,指针指向的是数组后面的未知内存,而非空指针(nullptr),所以while(xd)的条件永远为真,程序会持续访问非法内存,最终触发段错误。
下面是几种可靠的解决方式:
方法1:传入数组长度(兼容C风格写法)
给函数额外传入数组的元素个数,通过长度控制循环次数:
#include <stdio.h> #include <string> #include <iostream> using namespace std; struct something{ int a; string b; }; void printSomething(something* xd, size_t count){ for(size_t i = 0; i < count; ++i){ cout << xd[i].a << " " << xd[i].b << endl; } } int main() { something m[2]; m[0].a = 3; m[0].b = "xdxd"; m[1].a = 5; m[1].b = "abcc"; printSomething(m, 2); // 传入数组长度 return 0; }
方法2:使用C++容器(更现代的写法)
用std::vector代替C风格数组,它自带长度信息,支持范围for循环,更安全直观:
#include <string> #include <iostream> #include <vector> using namespace std; struct something{ int a; string b; }; void printSomething(const vector<something>& items){ for(const auto& item : items){ cout << item.a << " " << item.b << endl; } } int main() { vector<something> m = {{3, "xdxd"}, {5, "abcc"}}; printSomething(m); return 0; }
额外说明
不要试图用“哨兵值”(比如给最后一个元素的a设为特殊值)来判断结束,这种方式容易出错,且不适用于所有场景。优先选择传入长度或使用标准容器,这是C++中处理这类问题的常规方案。
内容的提问来源于stack exchange,提问作者xdxdxd
相关产品推荐
相关产品推荐

