这个程序中分段错误背后的原因是什么?

时间:2016-11-12 10:59:46

标签: c++ c

我创建了一个简单的程序来理解指针的行为。我试过这个程序来理解指针的行为,但它会产生一个分段错误。

#include<stdio.h>

int main()
{
    int x =9;

    /* what is meaning of this line when & operator is not used*/
    int *pts = x;

    printf("%d",*pts);
    return  0;
}

为什么会出现分段错误?我试图了解该计划的行为。

4 个答案:

答案 0 :(得分:2)

  

/ *这条线的含义是什么时候&amp;运算符未使用* /

     

int * pts = x;

这意味着您使用值x初始化指针(在程序中为9)。

  

为什么会出现分段错误?

因为9不是可以解除引用的合法指针值。因此*pts会导致细分错误。

答案 1 :(得分:2)

C11标准说(6.3.2.3指针):

  

整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示

重点是我的;它解释了为什么你会出现分段错误。您将任意值转换为指针,结果不指向对象;取消引用它会导致未定义的行为。

本段附有脚注说明:

  

将指向整数或整数的指针转换为指针的映射函数旨在与执行环境的寻址结构保持一致。

“除非如前所述”指的是:

  

值为0的整型常量表达式,或者类型为void *的表达式,称为空指针常量。 66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较。

答案 2 :(得分:1)

我猜你的代码是什么,

#include<stdio.h>

int main()
{
    int x =9;

    /* add & before x */
    int *pts = &x;

    printf("%d",*pts);
    return  0;
}

答案 3 :(得分:0)

您将指针pts的地址设置为无效地址(如Keine Lust所述)。当系统尝试取消引用指针(访问目标的值)时,它会失败并产生分段错误。运算符&返回可由指针使用的变量的地址。