【发布时间】:2018-07-17 08:30:45
【问题描述】:
这是我编写的一小段代码,用于测试我对指针的了解:
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;
我知道这样分配指针的缺陷。然而,上面的代码 sn-p 正确地打印出每个等级的值。问题是如果我使用 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 循环会导致分段错误。我知道分段错误的原因,但是两个sn-ps的代码不是基本相同吗?我使用https://www.onlinegdb.com/ 编写代码。
【问题讨论】:
-
您的代码只是一个指针,您需要为其分配一个有效地址。现在它指向一些垃圾值
-
你有一个指针,但是 它指向哪里? 未初始化的局部变量(甚至是指针)将有一个 indeterminate(并且看似随机)的值.在没有初始化的情况下以任何方式使用它们(当然除了初始化它们)会导致undefined behavior。如果你有 UB(未定义行为),那么任何关于行为的讨论都是没有意义的。
-
另一方面,对于 any 指针或数组
p和索引i,表达式p[i]恰好 等于@ 987654328@。我建议您始终使用前一种语法 (p[i]),因为它通常更易于阅读和理解。也少写了。 -
“以 any 方式使用它们是 UB”实际上是不正确的 - 您可以获取地址并将其以指针的形式传递给函数(然后可以分配一些东西)... 取消引用未初始化指针的任何用法都是UB。
-
我很清楚我的指针没有指向任何有效地址这一事实。我只是在测试编译器的行为。
标签: c++ pointers segmentation-fault