这是我编写的一小段代码,用于测试我对指针的了解:
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/编写代码。
答案 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个整数分配一些空间,而不是在其中可能还有另一个重要值的随机位置分配空间。