在调用函数中取消引用指针时出现分段错误

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(),然后访问一个变量,你可能仍然会得到值,但它是未定义的行为,任何事情都可能发生。

【讨论】:

以上是关于在调用函数中取消引用指针时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

从 C 调用汇编函数时出现分段错误错误

调用 c 函数时出现分段错误

在C中调用fgets时出现分段错误

尝试特别使用内在函数时出现分段错误_mm256_storeu_pd()

将指向数组的指针传递给函数时出现分段错误(C++)

调用 globfree() 时出现分段错误