2016-11-12 107 views
-3

我创建了一个简单的程序来理解指针的行为。我试过这个程序来理解指针的行为,但是它产生了分段错误。这个程序中分段错误的原因是什么?

#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; 
} 

为什么会出现分段故障?我试图了解程序的行为。

+0

这不是一个“调试我的代码的免费”服务! –

+0

你想要x的地址,而不是他的值,基本上你是说x的地址是0x0009(不是真的,你不允许访问这个地址,结果你得到了seg-fault):使用int * pts =&x;',其中'&x'表示地址x –

+2

这应该是编译器错误(或者至少是警告)。 – melpomene

回答

0

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

2

/*当操作者&未使用*/

INT * PTS = X是什么这一行的含义;

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

为什么会出现分段故障?

因为9不是合法的指针值,可以取消引用。所以*pts会导致分段错误。

2

的C11标准说(6.3.2.3指针):

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

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

附于本段落A脚注说明:

用于指针转换为整数或整数的指针的映射函数意在与执行环境的寻址结构一致。

的“除如前所述”是指:

一个整数常量表达式用值0,或者这样转换为类型无效*的表达式,被称为空指针常数。如果一个空指针常量被转换为一个指针类型,那么被调用的空指针所产生的指针将被保证与指向任何对象或函数的指针进行比较。

1

我猜,你是什么将代码,

#include<stdio.h> 

int main() 
{ 
    int x =9; 

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

    printf("%d",*pts); 
    return 0; 
} 
相关问题