在调用函数中取消引用指针时出现分段错误
Posted
技术标签:
【中文标题】在调用函数中取消引用指针时出现分段错误【英文标题】:Segmentation fault while dereferencing the pointer in the calling function 【发布时间】:2018-02-23 06:10:45 【问题描述】:当我运行以下代码时,我得到了分段错误错误,我无法纠正我的错误。
void test(int *c)
c++;
*c = 10;
cout<<*c<<endl;
int main()
int a =2;
int *b = &a;
test(b);
cout<<*b;
return 0;
我认为 b 应该指向值 '2'。但它却给出了一个错误。
【问题讨论】:
另外,不要假设标题。我们更喜欢可编译的示例。 你认为c++
会做什么?
@user202729 感谢您提出这个问题!
@AndersK。为什么我们不能访问这个内存,增量后存储在c中?
@ANKURSATYA 为什么你认为你可以?你认为它指向什么?
【参考方案1】:
你在test
中移动指针是为了什么?您将它移到变量 a
的内存后面并达到未定义的行为。
c
|
+---+---+
| 2 | |
+---+---+
|
++c
【讨论】:
但是 '*c' 的 cout 语句仍然执行并打印值 '10'。这是怎么发生的? @ANKURSATYA 您不拥有此内存,因此尝试访问它是未定义的行为。未定义的行为可能意味着任何事情,包括打印10
、无限循环、破坏您的计算机、删除您的重要文件等。
情况可能更进一步。在 PC 中,a
放在堆栈上,位于来自main
的返回地址之前。然后你把指针c
向上移动到栈上,至少这块栈内存是可用的。因此,您可以成功地写入和读取它。但很可能你已经覆盖了main
的返回地址并到达了崩溃。【参考方案2】:
void test(int *c)
c++;
*c = 10;
*c = 10
是未定义的行为,因为您正在写入不属于您的内存。
【讨论】:
【参考方案3】:使用c++
,您正在递增指针的值,而不是整数的值。它将指向一个未由您分配的新位置,并且会引发分段错误错误。新位置可能被其他程序或系统使用.....
【讨论】:
啊。我理解你的理由并撤回我的评论。 @LucaDiLiello 如果这个内存在执行时是空闲的怎么办?那我可以用吗? 是的,但它是特定于编译器的,无法保证它是如何工作的。 @ANKUR SATYA 如果内存空闲不会有问题,但考虑到现代系统的复杂性,这种行为根本无法预测。【参考方案4】:在函数测试中,'c' 的地址是 'a' 说 1000。现在你增加这个地址说它到达 1004,现在这个内存地址不是你分配的。
当你尝试访问不是你分配的内存时,会发生分段错误。
现在,当您尝试打印 *c 时,它可能会打印 10,但这是未定义的行为,有时甚至会导致 PC 崩溃。
为了更好地理解,当你释放内存时想想 free(),然后访问一个变量,你可能仍然会得到值,但它是未定义的行为,任何事情都可能发生。
【讨论】:
以上是关于在调用函数中取消引用指针时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章