在指针迭代中使用for循环时出现分段错误

时间:2018-07-17 08:30:45

标签: c++ pointers segmentation-fault

这是我编写的一小段代码,用于测试我对指针的了解:

int *grades;
*(grades+0) = 100;
*(grades+1) = 87;
*(grades+2) = 99;
*(grades+3) = 92;

cout<<*(grades+0)<<endl;
cout<<*(grades+1)<<endl;
cout<<*(grades+2)<<endl;
cout<<*(grades+3)<<endl;

我知道这样分配指针的缺陷。但是,上面的代码片段正确地打印出每个等级的值。问题是如果我使用for循环来自动显示指针内容。

int *grades;
*(grades+0) = 100;
*(grades+1) = 87;
*(grades+2) = 99;
*(grades+3) = 92;

for(int i=0;i<4;++i)cout<<*(grades+i)<<endl;

为什么添加for循环会导致分段错误。我知道分段错误的原因,但是两个代码片段是否基本相同?我使用https://www.onlinegdb.com/编写代码。

3 个答案:

答案 0 :(得分:1)

您的代码表现出未定义的行为。 grades指向无效的内存,因为它尚未初始化。尝试通过指针进行读取或写入会导致UB。看起来好像可行,但这只是UB可能的副作用之一。

如果您需要动态数组,请使用std::vector<int>,否则请坚持使用std::array<int, 5>

要使当前代码段正常工作:

std::array<int, 4> a;
int* grades = a.data();
*(grades+0) = 100;
*(grades+1) = 87;
*(grades+2) = 99;
*(grades+3) = 92;

答案 1 :(得分:1)

两种情况(带有或不带有for循环)都受相同的undefined behavior的影响,UB的本质是任何事情都可能发生。这就是为什么您的两个“基本相同”的片段的行为不同。

答案 2 :(得分:1)

您的动态数组是单位化的。所以现在它指向一个随机地址。 尝试这样做:

int* grades = new int[4];
// do things
delete [] grades;

因此,操作系统会为您的4个整数分配一些空间,而不是在其中可能还有另一个重要值的随机位置分配空间。